如何在子 shell 中激活 conda env?
How do I activate a conda env in a 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
.
的麻烦
另一个 post、 简要地谈到了这一点,但没有提供正确的答案。它没有在子 shell 中激活环境,而是说,继续并忽略 shebang ...只需使用 $ python program.py
语法。
在您的脚本中,更改...
#!/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.
>>>
您也可以使用 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
如果您总是计划从定义了 conda
的 shell 会话中 运行 脚本,那么另一种选择是让 Conda 使用 conda run
加载环境命令。在这种情况下,shebang 将是
#!/usr/bin/env conda run -n my_env python
这里的优点是调用 ./program.py
时不需要激活环境,也不必硬编码解释器的位置。
注意: 此命令在 Conda v4.6.0 中作为 "preview" 添加(参见 Release Notes) to address the issue of running a command inside an env.
接受的答案对我来说 运行,但是这个答案:
#!conda run -n your_conda_env_name python
这需要 $PATH 中的 conda,并且在 Windows。
我写了一个 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
.
另一个 post、$ python program.py
语法。
在您的脚本中,更改...
#!/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.
>>>
您也可以使用 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
如果您总是计划从定义了 conda
的 shell 会话中 运行 脚本,那么另一种选择是让 Conda 使用 conda run
加载环境命令。在这种情况下,shebang 将是
#!/usr/bin/env conda run -n my_env python
这里的优点是调用 ./program.py
时不需要激活环境,也不必硬编码解释器的位置。
注意: 此命令在 Conda v4.6.0 中作为 "preview" 添加(参见 Release Notes) to address the issue of running a command inside an env.
接受的答案对我来说 运行,但是这个答案:
#!conda run -n your_conda_env_name python
这需要 $PATH 中的 conda,并且在 Windows。