如何在子 shell 中激活 conda env?

问题描述 投票:0回答:5

我写了一个Python程序。如果我有一个像这样的shebang:

#!/usr/bin/python

我使文件可执行:

$ chmod 755 program.py

我可以像这样运行程序:

$ ./program.py

问题就在这里。我使用 conda 虚拟环境。当我像上面一样运行程序时,系统会创建一个无法识别活动环境的子shell:

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

如果我这样做的话...

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

如何指定子 shell 中使用的正确环境?是否可以?我想节省手指输入六个字符串

python
的精力。

另一篇文章,Conda 托管环境中的 Shebangs,简要介绍了这一点,但没有提供正确的答案。它没有激活子 shell 中的环境,而是说,继续并忽略 shebang...只需使用

$ python program.py
语法。

python bash conda shebang subshell
5个回答
29
投票

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

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

21
投票

conda run

如果您始终计划从定义了

conda
的 shell 会话运行脚本,那么另一种选择是让 Conda 使用
conda run
命令加载环境。在这种情况下,shebang 将是

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

这里的优点是,当你调用

./program.py
时不需要激活 env,并且不必硬编码解释器的位置。

注意: 此命令在 Conda v4.6.0 中作为“预览”添加(请参阅发行说明),以解决 在环境中运行命令的问题


3
投票

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


2
投票

接受的答案并不适合我,但这确实是:

#!conda run -n your_conda_env_name python

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


0
投票

我测试了上面提到的

conda run
方法,得到了以下错误

/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
选项将解决此问题。

所以最终的shebang可能是这样的

#! /usr/bin/env -S conda run --live-stream -n my_env python
© www.soinside.com 2019 - 2024. All rights reserved.