如果我有像这样激活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来执行此操作包装器。)
答案 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,如果有以import
,this 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)
有点黑,但应该可以。
python
中的bin
链接重命名为python.lnk
之类的在bin
文件夹中创建看起来像
python
#!/bin/sh export TEST='It works!' "$0.lnk" "$@"
使其可执行
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 的问题似乎 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/bin/activate
脚本中添加特定行,以使用 bash 语言添加环境值:
export FOO=BAR
然后用 source
命令激活它。
[^1]:您可能更喜欢通用的 #!/usr/bin/env python3
(python2 已弃用)。环境将适当地接受您的可执行文件。