Как мне активировать 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, кратко касается этого, но не дает правильного ответа. Вместо того, чтобы активировать среду в подоболочке, он просто говорит: "Идите дальше и игнорируйте шебанг... просто используйте $ python program.py синтаксис.

5 ответов

Решение

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

#!/usr/bin/python

... чтобы:

#!/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.
>>> 

conda run

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

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

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

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

Вы также можете указывать непосредственно на среду с помощью линии 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 делает скрипт менее переносимым, но если вы зависите от конкретных пакетов в конкретной виртуальной среде, это то, что вам нужно.

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

      #!conda run -n your_conda_env_name python

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

Я протестировал метод, упомянутый выше, и получил следующую ошибку

      /usr/bin/env: ‘conda run -n my_env python’: No such file or directory
/usr/bin/env: use -[v]S to pass options in shebang lines

после недолгих поисков я узнал, что здесьenvлечитconda run -n my_env pythonкак один длинный аргумент. и, как следует из сообщения об ошибке, добавление-Sрешит это.

другая проблема в том, чтоconda runпо умолчанию не обеспечивает вывод на терминал в режиме реального времени, что может быть нежелательно, если вы просто ищете альтернативу!/usr/bin/env python, добавив--live-streamопция это исправит.

Итак, если сложить все воедино, то окончательный результат выглядит вот так

      #! /usr/bin/env -S conda run --live-stream -n my_env python
Другие вопросы по тегам