1

我的理解是两者都应该设置环境变量。但是在 django 的文件中在这两者之间切换manage.py会导致不同的结果。

>>> help(os.environ.putenv)
putenv(name, value, /)                                       
    Change or add an environment variable

如果我编辑manage.py文件并更改os.environ.setdefaultos.environ.putenv,我会得到以下信息:

https://i.imgur.com/N0o2tKS.png

问题:为什么os.environ.setdefault在这种情况下有效,但os.environ.putenv不起作用。

4

1 回答 1

2

主要区别在于os.environ.setdefaultos.environ其视为 python dict,而os.putenv或对影响以、或和os.environ.putenv开头的子进程的环境进行更改。文档说明了以下关于和之间的关系:os.system()os.popen()os.fork()os.execv()os.putenvos.environos.putenv

对 in 项的赋值os.environ会自动转换为对 putenv() 的相应调用;但是,调用putenv()不更新os.environ,因此实际上最好分配给 os.environ 的项目。

根据上面的说法,更新环境变量os.putenv并不一定会更新os.environ字典。因此,它归结为如何使用相关环境变量。在 的情况下,使用以下代码行在文件Django中访问相关环境变量:django/config/__init__.py

settings_module = os.environ.get(ENVIRONMENT_VARIABLE)

显然,这条线被os.environ视为字典。由于使用所做的更改os.putenv不会影响此os.environ字典,django因此无法找到设置模块(即settings_module变量等于None)。

总而言之,如果你想更新环境变量,使用os.environ['VARIABLE'] = 'VALUE'or更加包容os.environ.setdefault。因为,如上所述,更新os.environ两者都会更新字典并调用os.putenv.

于 2021-07-17T18:48:18.247 回答