Как активировать conda env в подоболочке?

Я написал программу на Python. А если у меня такая шебанга:

#!/usr/bin/python

и я делаю файл исполняемым с помощью:

$ chmod 755 program.py

Я могу запустить программу так:

$ ./program.py

Вот в чем проблема. Я использую виртуальные среды conda. Когда я запускаю программу, как указано выше, система создает подоболочку, которая не распознает активную среду:

(my_env) $ ./program.py
ImportError: No module named pymongo

Но если я сделаю это так ...

(my_env) $ python program.py
# blah blah... runs great

Как указать правильную среду для использования в подоболочке? Является ли это возможным? Я хотел бы избавить свои пальцы от необходимости набирать шестизначную строку python.

В другом сообщении, Shebangs в средах, управляемых conda, это кратко затрагивается, но не предоставляется правильный ответ. Вместо того, чтобы активировать среду в подоболочке, он просто говорит, продолжайте и игнорируйте shebang ... просто используйте синтаксис $ python program.py.


person meh    schedule 28.01.2017    source источник


Ответы (4)


conda run

Если вы всегда планируете запускать сценарий из сеанса оболочки, в котором определено conda, то другой альтернативой будет позволить Conda загрузить env с помощью команды conda run. В этом случае шебанг будет

#!/usr/bin/env conda run -n my_env python

Преимущество здесь в том, что вам не нужно активировать env при вызове ./program.py, и вам не нужно жестко указывать местоположение интерпретатора.

Примечание. Эта команда была добавлена ​​в качестве предварительного просмотра в Conda v4.6.0 (см. Примечания к выпуску), чтобы решить проблему запуска команды внутри env.

person merv    schedule 18.10.2019
comment
Похоже, это лучший ответ. Если кто-то еще может убедиться, что это работает, я сделаю это принятым ответом. Я больше не использую среды conda, и мне пришлось бы настроить среду и фиктивный проект. Потребовалось бы больше времени, чем я хотел бы инвестировать в это прямо сейчас. - person meh; 21.10.2019
comment
@meh Я могу засвидетельствовать, что у меня это работает в Mac OS X и Linux (оболочки, настроенные с conda init). Не shebangs, а пользователь Windows подтвердил, что conda.exe run python сработал для них в этом ответе. - person merv; 22.10.2019
comment
Хорошо, я отдам его тебе. - person meh; 29.10.2019
comment
Это дает мне /usr/bin/env: conda run -n my_env python: No such file or directory. - person 0x5453; 09.06.2021
comment
@ 0x5453 убедитесь, что conda находится в вашем PATH (например, вы запустили /path/to/miniconda3/condabin/conda init для своей оболочки). Вот что означает запуск сценария из сеанса оболочки, в котором определено conda. - person merv; 09.06.2021
comment
@merv conda находится на моем пути. Запуск /usr/bin/env conda run -n my_env python -c 'import sys; print(sys.executable)' в оболочке дает нормальный результат. Похоже, что мое ядро ​​обрабатывает все в моем shebang после /usr/bin/env как один аргумент. (Этот вопрос кажется актуальным.) - person 0x5453; 10.06.2021
comment
@ 0x5453 ой - никогда раньше не ударял. Спасибо за внимание! - person merv; 10.06.2021

В вашем скрипте измените ...

#!/usr/bin/python

...to:

#!/usr/bin/env python

В активированной среде conda используется питон ${CONDA_PREFIX}/bin/python, а не /usr/bin/python

Заметили разницу?

(root) ~/condaexpts$ which python
/home/ubuntu/condaexpts/m3/bin/python

(root) ~/condaexpts$ /usr/bin/env python
Python 3.5.2 |Continuum Analytics, Inc.| (default, Jul  2 2016, 17:53:06) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 

(root) ~/condaexpts$ source deactivate

~/condaexpts$ which python
/usr/bin/python

~/condaexpts$ /usr/bin/env python
Python 2.7.6 (default, Oct 26 2016, 20:30:19) 
[GCC 4.8.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 
person Nehal J Wani    schedule 29.01.2017
comment
Спасибо, @Nehal, что есть правильный ответ. У этого есть имя? Что искать, чтобы найти это в документации? - person meh; 31.01.2017
comment
@meh Это довольно распространенный стандарт. Также прочтите этот ответ, который объясняет, почему мы используем этот shebang. askubuntu.com/a/88314/95343 - person Nehal J Wani; 31.01.2017
comment
Хорошо знать. Спасибо! - person meh; 31.01.2017
comment
Это зависит от того, что родительская среда conda уже активирована, что не было моим вариантом использования. - person Dave X; 19.09.2017
comment
Могу я указать только имя среды? Например. путь, который я получил, как этот, работает только на моем компьютере (как в /home/ubuntu/), даже если такая же среда установлена ​​на другом (но с другим абсолютным путем). - person nocibambi; 14.06.2019

Вы также можете указать непосредственно на среду с помощью строки shebang, чтобы не зависеть от чего-то, настраивающего родительскую среду перед вызовом сценария.

Сначала определите путь к предпочитаемой среде Python:

$ . activate mypython
$ which python
/home/username/anaconda/envs/mypython/bin/python      # for example 

Затем используйте его в скрипте:

#!/home/username/anaconda/envs/mypython/bin/python
import os,sys
print sys.executable
print os.__file__

Приведенный выше сценарий даст следующий результат:

/home/username/anaconda/envs/mypython/bin/python
/home/username/anaconda/envs/mypython/lib/python2.7/os.pyc

Наличие неуниверсальной команды в shebang делает сценарий менее переносимым, но если вы зависите от конкретных пакетов в конкретной виртуальной среде, это то, что вам нужно.

person Dave X    schedule 19.09.2017
comment
Хотя я думаю, что этот подход обычно хорош, следует отметить, что некоторые пакеты используют перехватчики активации для определения контекста времени выполнения, и поэтому использование интерпретатора напрямую без активации env пропустит это. - person merv; 18.10.2019

Принятый ответ у меня не сработал, но вот он:

#!conda run -n your_conda_env_name python

Для этого требуется conda в $ PATH, и это было в Windows.

person Da1ne    schedule 15.05.2021