如何在virtualenv中设置环境变量

新手上路,请多包涵

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

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

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

我希望这个环境变量对 所有 使用这个 virtualenv 的脚本都有效。

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

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

过去我认为自定义 sitecustomize.py 可以用于启动代码。但是 Ubuntu(AFAIK 是唯一这样做的发行版)带有自己的 sitecustomize.py 文件,结果是我的 sitecustomize.py 没有被调用。请参阅 https://bugs.launchpad.net/ubuntu/+source/python2.5/+bug/197219

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

(我再次考虑过这个问题。我想设置变量不是 python 或 virtualenv 的工作。我需要一种统一的方式来设置环境变量。在我的例子中,我想在不使用 shell 包装器的情况下这样做)。

原文由 guettli 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 809
2 个回答

在编写 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 文件,如果有一行以 import 开头, 则该行将被执行,允许注入任意代码。

优点是,你可以简单地编写一个 python 包来 安装这个 .pth 文件,安装工具,安装到你想要更改的 virtualenv。

原文由 georgexsh 发布,翻译遵循 CC BY-SA 4.0 许可协议

根据我的尝试,如果您在虚拟环境中创建一个 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'
>>>

原文由 Abhinav Upadhyay 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题