Python(Django):环境变量,可见性

时间:2015-01-10 06:37:18

标签: python django environment-variables

我一直试图以正确的方式管理DJANGO_SETTINGS_MODULE变量。为了方便,就是这样。这样(settings.py)

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "tango_with_django_project.settings")

它显然很好:

In [14]: os.environ['DJANGO_SETTINGS_MODULE']
Out[14]: 'tango_with_django_project.settings'

此外,我摆脱了让我解决问题的错误。唯一让我困扰的是输出的差异: os.environ [' DJANGO_SETTINGS_MODULE'] os.environ.values 显示存在变量 $ env (Linux)没有。虽然环境变量的各个列表确实非常相似。为什么不一样?

我知道一切都应该如此,但我无法找到任何迹象表明环境变量可能低于全局或每个用户。我错过了什么?

1 个答案:

答案 0 :(得分:0)

字典os.environ包含python进程从其生成的shell中生成的环境变量。

这段代码os.environ.setdefault('foo', 'bar')告诉这本词典在查找ke'foo'时提供值'bar'。这与python进程启动的环境变量无关,因为os.environ字典的创建是单向旅行。 os.environ不是对流程环境变量字典的某种“引用”,而是它的副本。因此,修改它对shell没有影响。

可能有办法从python中破解当前进程的环境变量,但os.environ只是进程启动时环境变量的快照。正如@Daniel Roseman正确指出的那样,如果从python进程内部启动控制台,os.environ值将再次复制到新shell。修改该shell中的任何变量反过来对生成shell的python进程的os.environ没有影响。

另一件需要考虑的事情是,无论何时你想在python解释器中启动django,你都需要将DJANGO_SETTINGS_MODULE最终用于django代码。这可以通过在设置该变量的控制台中启动python解释器,通过执行os.environ.setdefault hack-ish的事情,或者只是在该字典os.environ['DJANGO_SETTINGS_MODULE'] = 'whatever'中正确设置密钥来实现。

正如@Daniel Roseman指出的那样 - 你应该小心什么时候这样做。脚本manage.py仅从控制台调用,但不会被您为站点提供服务的apache(或其他)服务器调用。但是文件wsgi.py对于任何Web服务器都非常重要,并且设置environemt变量足够公平(意味着它可以工作)。

我正在做的是:拥有一个服务器将运行的虚拟环境,并且在该虚拟环境中,在激活环境时始终设置DJANGO_SETTINGS_MODULE变量,并在停用环境后取消设置。查看virtualenv和virtualenvwrapper系统软件包(如果您使用的是某些类型的Linux,那么这些软件包将可供您使用)