运行脚本时自动加载virtualenv

jpi*_*etz 21 python virtualenv

我有一个python脚本需要virtualenv的依赖.我想知道是否有某种方式我可以将它添加到我的路径并让它自动启动它的virtualenv,运行然后回到系统的python.

我尝试使用autoenv,.env但这似乎并没有完全符合我的要求.我还想过改变shabang指向virtualenv路径,但这似乎很脆弱.

Vla*_*lad 21

有两种方法可以做到这一点:

  1. 将虚拟env python的名称放入脚本的第一行.像这样

    #!/你/虚拟/ ENV /路/斌/蟒蛇

  2. 将虚拟环境目录添加到sys.path.请注意,您需要导入sys库.像这样

    导入系统

    sys.path.append( '/路径/到/虚拟/ env的/ lib中')

如果使用第二个选项,则可能需要向sys.path(站点等)添加多个路径.获得它的最好方法是运行你的虚拟env python解释器并删除sys.path值.像这样:

/your/virtual/env/bin/python

Python blah blah blah

> import sys
> print sys.path
[ 'blah', 'blah' , 'blah' ]
Run Code Online (Sandbox Code Playgroud)

将sys.path的值复制到上面的代码段中.


Lie*_*yan 11

我很惊讶没有人提到过这个,但这就是为什么activate_this.py在virtualenv的bin目录中有一个文件调用的原因.您可以将其传递execfile()给更改当前运行的解释器的模块搜索路径.

# doing execfile() on this file will alter the current interpreter's
# environment so you can import libraries in the virtualenv
activate_this_file = "/path/to/virtualenv/bin/activate_this.py"

execfile(activate_this_file, dict(__file__=activate_this_file))
Run Code Online (Sandbox Code Playgroud)

您可以将此文件放在脚本的顶部,以强制脚本始终在该virtualenv中运行.与修改hashbang不同,您可以通过执行以下操作来使用相对路径:

script_directory = os.path.dirname(os.path.abspath(__file__))
activate_this_file = os.path.join(script_directory, '../../relative/path/to/env/bin/activate_this.py')
Run Code Online (Sandbox Code Playgroud)


ala*_*lan 5

来自virtualenv 文档:

如果直接从virtualenv的bin /目录运行脚本或python解释器(例如path/to/env/bin/pip或/ path/to/env/bin/python script.py),则无需激活.

因此,如果您只是在virtualenv中调用python可执行文件,那么您的virtualenv将是"活动的".所以你可以创建一个这样的脚本:

#!/bin/bash

PATH_TO_MY_VENV=/opt/django/ev_scraper/venv/bin

$PATH_TO_MY_VENV/python -c 'import sys; print(sys.version_info)'
python -c 'import sys; print(sys.version_info)'
Run Code Online (Sandbox Code Playgroud)

当我在我的系统上运行这个脚本时,两个调用python打印下面你看到的内容.(Python 3.2.3在我的virtualenv中,2.7.3是我的系统Python.)

sys.version_info(major=3, minor=2, micro=3, releaselevel='final', serial=0)
sys.version_info(major=2, minor=7, micro=3, releaselevel='final', serial=0)
Run Code Online (Sandbox Code Playgroud)

因此,当您致电时,您在virtualenv中安装的任何库都将可用$PATH_TO_MY_VENV/python.对您的常规系统的调用python当然不会意识到virtualenv中的任何内容.