我想确保os.environ和sys.path对于我们启动Python解释器的所有方式都是相同的:
有什么共同的办法解决这个问题吗?
如果是的话,那就太好了:看起来怎么样?
如果不是,可悲的是:每个人都自己解决这个问题。..。解决这个问题的好办法是什么?
操作系统: Linux (支持System d)
更新
更明确的是:
sys.path在web请求,cron作业,python从shell开始,.os.environ在web请求,cron作业,python从shell开始,.Update2
对于系统,我们使用EnvironmentFile
Update3
我们使用虚拟环境
发布于 2016-02-10 11:45:48
您可以使用恩夫迪尔 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']或者您可以通过命令行上的envdir运行进程,例如:envdir envs/prod/ python manage.py runserver
我建议为python、pip等创建别名(因为您不想覆盖系统自己的python),例如:alias python-mycorp="envdir /abs/path/to/envs/prod/ python" (如果您愿意,可以编写完整的shell脚本而不是别名)。
发布于 2016-02-05 14:06:38
这个映射是在第一次导入os模块时捕获的,通常是在Python启动时作为处理site.py的一部分。在此之后对环境所做的更改不会反映在os.environ中,除了通过直接修改os.environ所做的更改外。
他们都必须使用相同的翻译。如果它们是由同一个用户启动的,那么它们很可能是。
发布于 2016-02-10 12:33:24
正如您在sys.path文档中所看到的,它是使用环境变量PYTHONPATH初始化的,然后使用安装相关默认值(站点)进行初始化。所以,他们的意图是不同的。
但是,您可以在解释器调用期间使用-S选项:python -S script.py,以跳过某些站点特定的配置挂钩。尽管如此,您的sys.path中仍然会有标准的库内容。
如果您真的想要os.path['PYTHONPATH'] == sys.path,就应该显式地执行它,如文档所述:
程序可以为自己的目的修改此列表。
放置这类特定操作的标准位置是:
sitecustomize模块,通常由站点包目录中的系统管理员创建,可以执行任意配置。usercustomize模块,它的意图与sitecustomize相同,但只有在ENABLE_USER_SITE为真时才执行。sys.path。sys.path = os.env['PYTHONPATH']。https://stackoverflow.com/questions/35223828
复制相似问题