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

Python (Django): environment variables, visibility

我一直在尝试以正确的方式管理 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'

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

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

字典 os.environ 包含生成 python 进程的环境变量,来自生成它的 shell。

这段代码 os.environ.setdefault('foo', 'bar') 告诉这个字典在查找 ke 'foo' 时提供值 'bar'。这与启动 python 进程的环境变量无关,因为 os.environ 字典的创建是单程的。 os.environ 不是进程环境变量字典的某种 "reference",而是它的副本。因此,修改它对 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 服务器都非常重要,并且在那里设置你的环境变量就足够了(这意味着它会起作用)。

但是我正在做的是:有一个服务器将在其中 运行 的虚拟环境,并且在该虚拟环境中,始终在环境为 DJANGO_SETTINGS_MODULE 时设置变量激活,并在停用环境后取消设置。查看 virtualenv 和 virtualenvwrapper 系统包(如果您正在使用某种 linux,这些将对您可用)