Python:确保os.environ和sys.path相等:web-requests,shell,cron,celery

gue*_*tli 11 python django environment-variables sys.path

我想,以确保os.environsys.path是我们开始Python解释所有的方式相同:

  • 通过Django和Apache mod_wsgi发送Web请求
  • Cron的工作
  • 通过ssh进行交互式登录
  • 芹菜工作
  • 乔布斯通过systemd开始

有没有一种常见的解决方法?

如果是,那很好:它看起来怎么样?

如果不,那么伤心:每个人都自己解决这个问题.......解决这个问题的好方法是什么?

操作系统:Linux(支持systemd)

更新

更明确:

  1. 我希望sys.path在Web请求,cron作业,从shell启动的python中都是一样的,...
  2. 我希望os.environ在Web请求,cron作业,从shell启动的python中都是一样的,...

UPDATE2

对于systemd,我们使用EnvironmentFile

UPDATE3

我们使用virtualenv

zse*_*epi 6

您可以使用envdir python端口(这是原始端口)来管理环境变量.

如果您关心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']
Run Code Online (Sandbox Code Playgroud)

或者您可以envdir在命令行上运行您的过程,例如:envdir envs/prod/ python manage.py runserver

我建议为python,pip等创建别名(因为你不想覆盖系统自己的python),例如:( alias python-mycorp="envdir /abs/path/to/envs/prod/ python"或者如果你愿意,写一个完整的shell脚本而不是别名).


Avi*_*aor 2

该映射是在第一次导入 os 模块时捕获的,通常是在 Python 启动期间作为处理 site.py 的一部分。此时间之后对环境所做的更改不会反映在 os.environ 中,除非直接修改 os.environ 进行的更改。

他们都必须使用同一个口译员。如果它们是由同一用户启动的,则很可能是这样。