Подтвердить что ты не робот

Как найти имя среды conda, в которой работает мой код?

Я ищу хороший способ определить имя среды conda, в которой я вхожу, из исполняемого кода или интерактивного экземпляра python.

Случай использования: я запускаю Jupyter ноутбуки с ядрами Python 2 и Python 3 из установки miniconda. По умолчанию используется среда Py3. Для Py2 существует отдельная среда. Внутри файла ноутбука я хочу, чтобы он попытался conda install foo. Я использую subcommand для этого, потому что я не могу найти программный эквивалент conda pip.main(['install','foo']).

Проблема в том, что команда должна знать имя среды Py2 для установки foo там, если ноутбук работает с использованием ядра Py2. Без этой информации он устанавливается в env по умолчанию Py3. Я бы хотел, чтобы код определял, в какой среде он находится, и правильное имя для него.

Лучшее решение, которое я получил до сих пор:

import sys

def get_env():
    sp = sys.path[1].split("/")
    if "envs" in sp:
        return sp[sp.index("envs") + 1]
    else:
        return ""

Есть ли более прямой/подходящий способ для этого?

4b9b3361

Ответ 1

Вы хотите $CONDA_DEFAULT_ENV или $CONDA_PREFIX:

$ source activate my_env
(my_env) $ echo $CONDA_DEFAULT_ENV
my_env

(my_env) $ echo $CONDA_PREFIX
/Users/nhdaly/miniconda3/envs/my_env

$ source deactivate
$ echo $CONDA_DEFAULT_ENV  # (not-defined)

$ echo $CONDA_PREFIX  # (not-defined)

В python:

In [1]: import os
   ...: print os.environ['CONDA_DEFAULT_ENV']
   ...:
my_env

Переменные среды не являются хорошо документированными. Вы можете найти здесь CONDA_DEFAULT_ENV: https://www.continuum.io/blog/developer/advanced-features-conda-part-1

Единственная информация о CONDA_PREFIX, которую я мог найти, - это проблема: https://github.com/conda/conda/issues/2764

Ответ 2

Я использую это:

import sys
sys.executable.split('/')[-3]

имеет то преимущество, что не предполагает, что env находится в пути (и вложено в envs). Кроме того, он не требует активации среды через source activate.

Изменение: Если вы хотите убедиться, что он работает и в Windows:

import sys
from pathlib import Path
Path(sys.executable).as_posix().split('/')[-3]

Для пояснения: sys.executable дает вам путь к текущему интерпретатору Python (независимо от того, активировать/деактивировать) - например, '/Users/danielsc/miniconda3/envs/nlp/bin/python'. Остальная часть кода просто занимает 3-й из последнего сегмента пути, который является именем папки, в которой находится среда, и обычно также является именем среды Python.

Ответ 3

очень просто, вы могли бы сделать

envs = subprocess.check_output('conda env list').splitlines()
active_env = list(filter(lambda s: '*' in str(s), envs))[0]
env_name = str(active_env).split()[0]

Ответ 4

Поскольку подобные поиски, относящиеся к тому, "как мне определить мою среду Python", приводят к этому ответу, я подумал, что я также упомяну способ, из которого я узнаю, из какой среды я сейчас выполняю свой код. Я проверяю местоположение моего бинарного файла, который указывает на местоположение в текущей среде. Посмотрев на вывод следующей команды, вы можете легко определить, в какой среде вы находитесь. (Обратите внимание, что это решение неприменимо, если вы унаследовали пакеты pip от вашей глобальной среды/другой среды)

В командной строке Windows:

where pip

Если вы находитесь внутри Jupyter Notebook, добавьте восклицательный знак (!) Перед командой, чтобы выполнить команду в командной строке хоста:

in[10]: !where pip

Вывод будет выглядеть примерно так:

C:\Users\YourUsername\.conda\envs\YourEnvironmentName\Scripts\pip.exe
C:\ProgramData\Anaconda3\Scripts\pip.exe

YourEnvironmentName выдает имя вашей текущей среды.

В Linux/Mac вы можете использовать команду which вместо where: (не проверено).

Для среды Python3

which pip3

Из записной книжки Jupyter:

in[10]: !which pip3

Это должно напрямую указывать на местоположение в вашей текущей среде.

Ответ 5

Редактировать: Ой, я не заметил Ivo ответ. Скажем, я немного расширяюсь.


Если вы запускаете свой скрипт на python из терминала:

import os
os.system("conda env list")

Это выведет список всех сред conda, например, из терминала со conda env list.

Немного лучше:

import os
_ = os.system("conda env list | grep '*'")

Бит _ = отключит существующее состояние вызова os.system (0 случае успеха), а grep выведет только строку с активированной средой conda.

Если вы не запускаете свой скрипт из терминала (например, он запланирован через crontab), то вышеописанному не будет где-нибудь "напечатать" результат. Вместо этого вам нужно использовать что-то вроде модуля subprocess python. Самое простое решение - запустить:

import subprocess
output = subprocess.check_output("conda env list | grep '*'", shell=True, encoding='utf-8')
print(output)

А именно, output - это строка, содержащая выходные данные conda env list, а не ее состояние выхода (это тоже можно получить, см. Документацию модуля subprocess).

Теперь, когда у вас есть строка с информацией об активированной среде conda, вы можете выполнить любой тест (с использованием регулярных выражений) для выполнения (или нет) установок, упомянутых в вашем вопросе.

Примечание.
Конечно, print(output) в вышеприведенном блоке не будет иметь эффекта, если ваш скрипт не запускается из терминала, но если вы тестируете блок в скрипте, который вы запускаете из терминала, то вы можете убедиться, что он дает вам то, что вы хотите, Например, вы можете напечатать эту информацию в файл журнала (рекомендуется использовать модуль logging).

Ответ 6

В Windows (может работать, но не тестировалась в Linux):

import sys
import os

# e.g. c:\Users\dogbert\Anaconda3\envs\myenvironment
print( sys.exec_prefix.split(os.sep)[-1] )

Ответы, использующие переменные среды или предполагающие разделитель пути "/", не работали в моей среде Windows/Anaconda3.

Это предполагает, что вы находитесь в окружающей среде.