Как мне активировать 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