python - 如何在 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 的一些方法:
- 通过 unix cron 执行的脚本。
- systemd 服务中的 virtualenv。请参阅:如何在 systemd 服务单元中启用 virtualenv?
- 通过 mod_wsgi (Apache):https ://modwsgi.readthedocs.io/en/develop/user-guides/virtual-environments.html#daemon-mode-single-application
(我又考虑过这个问题。我想设置变量不是python或virtualenv的工作。我需要一种统一的方法来设置环境变量。就我而言,我想在不使用shell包装器的情况下这样做)。
解决方案
虽然写入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 包来使用 setuptools安装此.pth
文件,安装到您要更改的 virtualenv。
推荐阅读
- laravel - 将 Laravel 部署到 Azure - Laravel 8
- java - 带有多个 catch 语句的 run()
- python - 在 tkinter 中将数字和文本打印到画布中
- javascript - 使用 ejs 模块运行构建 webpack 时找不到模块
- python - 与熊猫的算术级数
- javascript - Javascript按钮onclick功能不起作用
- scala - Scala 格式化元组字符串到元组
- sql - SQL 十六进制字符串转十进制值
- java - 为什么我的 if else 语句不能按预期工作?输入问题
- python - 如果它包含在另一个字符串列中,则从列表中获取字符串