我想确保os.environ
和sys.path
对于我们启动Python解释器的所有方式都是相同的:
有解决这个问题的常用方法吗?
如果是,那很好:它看起来如何?
如果不,伤心:每个人都自己解决这个问题。 ......解决这个问题的好方法是什么?
操作系统:Linux(具有systemd支持)
更新
更明确:
sys.path
在Web请求中相同,cron作业,从shell启动的python,... os.environ
在Web请求中相同,cron作业,从shell启动的python,... UPDATE2
对于systemd,我们使用EnvironmentFile
UPDATE3
我们使用virtualenv
答案 0 :(得分:6)
您可以使用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脚本而不是别名)。
答案 1 :(得分:2)
第一次导入os模块时捕获此映射, 通常在Python启动期间作为处理site.py的一部分。变化 在此时间之后制造的环境没有反映出来 os.environ,除了直接修改os.environ所做的更改。
他们都必须使用相同的解释器。如果它们由同一用户启动,则可能是。
答案 2 :(得分:2)
正如您在sys.path的文档中所看到的,它是使用环境变量PYTHONPATH
初始化的,然后是依赖于安装的默认值(site)。所以,它们的目的不同。
但是,您可以在解释器调用期间使用-S
选项:python -S script.py
以跳过某些特定于站点的配置挂钩。尽管如此,您仍然可以在sys.path
中使用标准库。
如果你真的想要os.path['PYTHONPATH'] == sys.path
,你应该明确地这样做,正如文档所说:
程序可以自行修改此列表
进行这些特定操作的标准位置是:
sitecustomize
模块,通常由site-packages目录中的系统管理员创建,可以进行任意配置。usercustomize
模块,其意图与sitecustomize
相同,但仅在ENABLE_USER_SITE
为真时执行。sys.path
。 I.e:sys.path = os.env['PYTHONPATH']
。答案 3 :(得分:-2)
我会假设你的意思是 os.environ ['PYTHONPATH'] == sys.path ,因为否则我无法理解这个问题。 无论如何,解决方案是使用virtualenvs。
完成。