我想确保 os.environ
和 sys.path
对于我们启动 Python 解释器的所有方式都是相同的:
- 通过 Django 和 Apache mod_wsgi 的网络请求
- 计划任务
- 通过 ssh 交互式登录
- celery 作业
- 通过 systemd 启 Action 业
有解决这个问题的通用方法吗?
如果是,那就太好了:它看起来怎么样?
如果没有,很伤心:每个人都会自己解决这个问题。 ...解决这个问题的好方法是什么?
操作系统:Linux(支持systemd)
更新
更明确:
- 我希望
sys.path
在网络请求、cron 作业、从 shell 启动的 python 中相同,... - 我希望
os.environ
在 Web 请求、cron 作业、从 shell 启动的 python 中相同,...
更新2
对于 systemd,我们使用 EnvironmentFile
更新3
我们使用虚拟环境
最佳答案
您可以使用 envdir用于管理环境变量的 python 端口(here is the original)。
如果您只关心Django,我建议您以编程方式使用settings.py
中的envdir
您可以通过编程方式更新环境(例如:在wsgi文件中,django的manage.py
、settings.py
等)
import envdir
import os
# print os.environ['FOO'] # would raise a KeyError
path = '../envdir/prod'
if not os.path.isdir(path):
raise ValueError('%s is not a dir' % path)
envdir.Env(path)
print os.environ['FOO']
或者您可以通过命令行上的 envdir
运行您的进程,例如:envdir envs/prod/python manage.py runserver
我建议为 python、pip 等创建别名(因为你不想覆盖系统自己的 python),例如:alias python-mycorp="envdir/abs/path/to/envs/prod/python"
(或者如果您愿意,可以编写完整的 shell 脚本而不是别名)。
关于Python:确保 os.environ 和 sys.path 相等:web-requests、shell、cron、celery,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35223828/