Как найти имя среды 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 ""
Есть ли более прямой/подходящий способ для этого?
Ответы
Ответ 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.
Это предполагает, что вы находитесь в окружающей среде.