如何在virtualen中设置环境变量

2024-04-25 14:32:59 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

我希望此环境变量对于使用此virtualenv的所有脚本都处于活动状态。

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

在python脚本周围编写一个shell包装器脚本是可行的,但是我想避免这种情况。

在过去,我认为定制的sitecustomize.py可以用于启动代码。但是Ubuntu(AFAIK是唯一一个这样做的发行版)自带了自己的sitecommize.py文件,其效果是不会调用my sitecommize.py。见https://bugs.launchpad.net/ubuntu/+source/python2.5/+bug/197219

以下是我想如何使用virtualenv的一些方法:

(我又考虑过了。我想设置变量不是python或virtualenv的工作。我需要一个统一的方法来设置环境变量。在我的例子中,我希望不使用外壳包装器。


Tags: topath方法pyhttps脚本binvirtualenv
3条回答

有点老套,但应该管用。

  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!"

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

在虚拟环境中创建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'
>>>

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

$ ~/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'
>>>

在编写sitecustomize.py文件和更改bin/python这些都是可行的解决方案时,我建议使用另一种方法,这种方法不需要直接更改virutalenv中的内容,只需安装.pth文件即可:

./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 ^{} file with setuptools,安装到您想要更改的virtualenv。

相关问题 更多 >