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

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

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

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

Лучшее решение, которое у меня есть на данный момент:

import sys

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

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


person Alnilam    schedule 11.04.2016    source источник
comment
Если я не ошибаюсь, conda install x будет устанавливаться в любой текущей среде: поэтому, если ноутбук находится в среде Python 2, он будет установлен в этой среде.   -  person    schedule 11.04.2016
comment
Я просто попробовал следующий эксперимент. В записной книжке Jupyter, запущенной из моей среды anaconda по умолчанию (но с доступными ядрами ipython Py2 и Py3), я запускал !conda env list в одной ячейке и import subprocess; print(subprocess.check_output(['conda','env', 'list']).decode()) в другой. Оба показывают, что env по умолчанию активен, независимо от того, запускаю ли я ноутбук в Py2 или Py3, поэтому может быть, что команды, выдаваемые против ОС, работают в любом env, с помощью которого был запущен сервер jupiter.   -  person Alnilam    schedule 13.04.2016
comment
Мне нужно что-то попроще, как узнать, какой conda env у вас запущен из оболочки? (примечание стороны, вы можете вызвать эту команду из python)   -  person Charlie Parker    schedule 09.06.2020
comment
ответ на мой собственный комментарий conda env list, а * указывает на текущий включенный env. Причина, по которой я это делаю, заключается в том, что, несмотря на то, что имя отображается в приглашении имени терминала, у меня были проблемы, когда приглашение не соответствовало используемому мной env (например, используя vscode).   -  person Charlie Parker    schedule 09.06.2020
comment
Если вам нужен абсолютный путь, $ echo $CONDA_PREFIX см. Вывод: /home/miranda9/miniconda3/envs/metalearning   -  person Charlie Parker    schedule 26.04.2021


Ответы (8)


Вы хотите $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)

В питоне:

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

person NHDaly    schedule 08.03.2017
comment
Решение Python не работает для py3, потому что ... круглые скобки ... для py3: - person Textcape; 06.04.2020
comment
печать (os.environ ['CONDA_DEFAULT_ENV']) - person Textcape; 06.04.2020
comment
Отлично. Я просто хочу добавить, что source deactivate устарел, теперь вам нужно использовать conda deactivate. - person norman123123; 11.07.2020

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

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.

person Daniel Schneider    schedule 23.02.2019
comment
Как это дает название среде conda? - person Antoine; 11.06.2019
comment
Это неверно, если вы запускаете питон не из активной среды. - person Christopher Barber; 29.07.2019
comment
для меня это Path(sys.executable).as_posix().split('/')[-2] - person Triamus; 19.02.2020

conda info

напрямую перечисляет всю информацию, где в первых строках вы можете увидеть

active environment: (some name)
active env location: (location of active environment)

Думаю, это наиболее понятный способ.

В интерактивной среде, такой как Jupyter Notebook или Jupyter Lab, вы должны использовать% перед вводом команд, как показано ниже:

%conda info
person CrmXao    schedule 24.11.2020

Изменить: К сожалению, я не заметил ответа Иво. Скажем, я немного расширил его.


Если вы запустите свой скрипт 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), то вышеупомянутому не будет где «распечатать» результат. Вместо этого вам нужно использовать что-то вроде модуля python subprocess. Самое простое решение, наверное, запустить:

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).

person Antoine    schedule 11.06.2019

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

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]
person Ivo    schedule 11.04.2016
comment
Я получаю сообщение об ошибке при запуске, если я не помещаю команду в виде списка - ['conda','env','list'] - а затем я получаю тот же ответ (root) независимо от того, запускаю ли я это с помощью ядра Py2 или Py3. Однако проверка sys.path показывает разные результаты для каждого. - person Alnilam; 13.04.2016

Поскольку аналогичные поиски, связанные с вопросом «как определить среду Python», приводят к этому ответу, я подумал, что также упомяну способ узнать, из какой среды я сейчас запускаю свой код. Я проверяю расположение моего pip двоичного файла, который указывает на расположение в текущей среде. Посмотрев на вывод следующей команды, вы можете легко определить, в какой среде вы находитесь. (Обратите внимание, что это решение не применимо, если вы унаследовали пакеты 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

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

person codeslord    schedule 19.05.2019
comment
Это отвечает на мое замешательство. Я установил ноутбук jupyter с pip3 install, и ноутбук jupyter будет работать в среде, заданной pip3 вместо conda. У меня установлена ​​conda, но на моем Linux CentOS не установлена ​​Anaconda. - person sonictl; 15.06.2021

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

import sys
import os

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

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

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

person MZB    schedule 29.08.2019

  1. В нескольких ответах предлагается использовать 'which pip', 'which python' или 'conda env list to grep the default'. Это работает, если пользователь делает что-то вроде: $ conda activate env_name; $ python ... или $ jupyter notebook / jupyterlab.

  2. Когда пользователь вызывает python напрямую без активации conda, метод №1 не работает: например, $ / opt / conda / envs / my_env / bin / python (где my_env - имя env)

  3. В более общем случае с jupyter notebook можно выбрать любой из доступных conda env / kernel, и выбранный вариант может отличаться от значения по умолчанию.

  4. Таким образом, решение состоит в том, чтобы изучить исполняемый файл или путь к вашему текущему питону, как это уже писали несколько человек. По сути, sys.path возвращает полный путь к исполняемому файлу, и затем можно использовать split для определения имени после envs /, которое будет env_name. Человек, задавший этот вопрос, дал довольно хороший ответ, за исключением того, что упустил это ....

  5. Я не думаю, что какой-либо пост позаботился об особом случае базового окружения. Обратите внимание, что python из базового окружения - это просто / opt / conda / bin / python. Таким образом, можно просто добавить следующий фрагмент кода, чтобы выполнить сопоставление if / opt / conda / bin / python в sys.path: return 'base'

  6. Здесь мы предполагаем, что conda установлена ​​на / opt / conda. Для действительно общего решения можно использовать $ conda info --root, чтобы найти путь установки.

person cchung85    schedule 12.05.2020