如何激活子shell中的conda env?

时间:2017-01-28 20:54:29

标签: python bash conda shebang subshell

我写了一个python程序。如果我有这样一个shebang:

#!/usr/bin/python

我用以下文件使文件可执行:

$ chmod 755 program.py

我可以像这样运行程序:

$ ./program.py

这是问题所在。我使用conda virtual environments。当我运行上面的程序时,系统会创建一个不识别活动环境的子shell:

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

如果我这样做,不过......

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

如何指定在子shell中使用的正确环境?可能吗?我想保存手指输入python六个字符串的工作。

另一篇文章Shebangs in conda managed environments简要介绍了这一点,但未提供正确的答案。它只是说,而不是激活子shell中的环境,继续忽略shebang ...只需使用$ python program.py语法。

4 个答案:

答案 0 :(得分:11)

在您的脚本中,更改...

#!/usr/bin/python

...为:

#!/usr/bin/env python

激活的conda环境使用的python是${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.
>>> 

答案 1 :(得分:2)

conda run

如果您始终打算从定义了conda的shell会话中运行脚本,那么另一种选择是让Conda使用conda run命令加载env。在这种情况下,shebang应该是

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

这样做的好处是,调用./program.py时不需要激活环境,也不必对解释器的位置进行硬编码。

注意::此命令已作为Conda v4.6.0中的“预览”(请参见Release Notes)添加到地址the issue of running a command inside an env

答案 2 :(得分:1)

您还可以使用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中使用非泛型命令会降低脚本的可移植性,但如果您依赖于特定虚拟环境中的特定包,则这就是您想要的。

答案 3 :(得分:1)

接受的答案不适合我,但是这样做了:

#!conda run -n your_conda_env_name python

这需要 $PATH 中的 conda,并且是在 Windows 上。