如何在virtualenv

时间:2018-09-21 18:53:52

标签: python virtualenv

如果我有像这样激活virtualenv的python脚本:

#!/path/to/venv/bin/python

如何在不修改此脚本的情况下为此脚本设置变量?

我希望此环境变量对于使用该virtualenv的所有脚本有效。

这意味着修改此脚本不是解决方案,因为有20个脚本,而我不想修改20个脚本。

可以在python脚本周围写一个shell wrapper-script可以,但是我想避免这种情况。

过去,我认为自定义sitecustomize.py可用于启动代码。但是Ubuntu(AFAIK是唯一执行此操作的发行版)带有自己的sitecustomize.py文件,其作用是不会调用我的sitecustomize.py。参见https://bugs.launchpad.net/ubuntu/+source/python2.5/+bug/197219

以下是我要使用virtualenv的一些方法:

(我再考虑过一次。我猜它设置变量不是python或virtualenv的工作。我需要一种统一的方法来设置环境变量。在我的情况下,我想不使用shell来执行此操作包装器。)

5 个答案:

答案 0 :(得分:9)

在编写sitecustomize.py文件和更改bin/python时都是可行的解决方案,我建议另一种方法不涉及直接在virutalenv内部更改内容,只需安装一个.pth文件:< / p>

./venv/lib/python2.7/site-packages/_set_envs.pth

内容:

import os; os.environ['FOO'] = 'bar'

测试:

$ ./venv/bin/python -c "import os; print os.getenv('FOO')"
bar

诀窍是,python将加载每个.pth文件on startup,如果有以importthis line will be get executed开头的行,则允许注入任意代码。

优点是,您只需将Python包编写到install this .pth file with setuptools,然后安装到要更改的virtualenv中即可。

答案 1 :(得分:3)

从我的尝试来看,如果您在虚拟环境中创建一个sitecustomize.py文件,它将优先于安装在sitecustomize.py目录中的全局/usr/lib/python2.7。这是我所做的:

在虚拟环境中创建sitecustomize.py

$ echo "import os; os.environ['FOO'] = 'BAR'" > ~/venvs/env_test/lib/python2.7/sitecustomize.py

从虚拟环境运行Python二进制文件时,验证它是否已导入并执行

$ ~/venvs/env_test/bin/python
Python 2.7.15rc1 (default, Apr 15 2018, 21:51:34)
[GCC 7.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sitecustomize
>>> sitecustomize.__file__
'/home/abhinav/venvs/env_test/lib/python2.7/sitecustomize.py'
>>> import os
>>> os.environ['FOO']
'BAR'
>>>

即使没有显式导入FOO,也只需验证是否设置了sitecustomize

$ ~/venvs/env_test/bin/python
Python 2.7.15rc1 (default, Apr 15 2018, 21:51:34)
[GCC 7.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.environ['FOO']
'BAR'
>>>

答案 2 :(得分:2)

在尝试 dotenv 包以及 .pth 方法后,我发现它们对我不起作用。所以,我只是修改了 venv/bin/activate 脚本,并在那里导出了变量。

这就是想法。

$ cat venv/bin/activate

deactivate () {
    unset FOO
    unset BAR
    ...
}

...

export FOO='xxx'
export BAR='xxx'

答案 3 :(得分:0)

有点黑,但应该可以。

  1. 将虚拟环境python中的bin链接重命名为python.lnk之类的
  2. bin文件夹中创建看起来像

    的文件python
    #!/bin/sh
    
    export TEST='It works!'
    
    "$0.lnk" "$@"
  3. 使其可执行

    chmod +x python

然后,如果您运行类似的脚本

#!/work/venv/bin/python
import os

print 'Virtualenv variable TEST="{}"'.format(os.environ['TEST'])

如下:

./myscript.py

它打印出来:

Virtualenv variable TEST="It works!"

答案 4 :(得分:0)

如何在 Ubuntu 中操作

Ubuntu 的问题似乎 python 包带有 PYTHONNOUSERSITE 作为 cPython 编译标志。您可以使用 site module 找到它,并看到 site.ENABLE_USER_SITE 设置为 False。

问题的具体问题

tl;dr #!/path/to/venv/bin/python 不足以执行您的虚拟环境。

尽管其余的答案在某些情况下似乎是正确的,但问题的问题在于他使用 #!/path/to/venv/bin/python 强制执行,但是您好在他的问题中没有提供任何上下文虚拟环境,所以我想他没有在运行脚本之前激活他的虚拟环境。

那没用,因为该命令通常链接到您的系统 python 可执行文件[^1] 并执行更多操作。此外,默认情况下,如果您不使用 source /path/to/venv/bin/activate 激活虚拟环境或配置 apache 或 nginx 来管理您的 venv,您将使用系统环境变量。

venv 中环境变量的解决方案

然后,可以在您的 venv/bin/activate 脚本中添加特定行,以使用 bash 语言添加环境值:

export FOO=BAR

然后用 source 命令激活它。


[^1]:您可能更喜欢通用的 #!/usr/bin/env python3(python2 已弃用)。环境将适当地接受您的可执行文件。