我的理解是,两者都应该设置环境变量。但是在django的manage.py文件中,这两者之间的切换会导致不同的结果。
>>> help(os.environ.putenv)
putenv(name, value, /)
Change or add an environment variable如果编辑manage.py文件并将os.environ.setdefault更改为os.environ.putenv,将得到以下内容:

问题:为什么os.environ.setdefault在这种情况下工作,但os.environ.putenv不能工作。
发布于 2021-07-17 18:48:18
主要区别在于,os.environ.setdefault将os.environ视为python dict,而os.putenv或os.environ.putenv则对环境进行更改,从而影响以os.system()、os.popen()或os.fork()和os.execv()启动的子进程。os.putenv的文档说明了os.environ和os.putenv之间的关系
分配给
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'或os.environ.setdefault就更具有包容性。因为,如前所述,更新os.environ既更新了字典,也调用了os.putenv。
https://stackoverflow.com/questions/68423096
复制相似问题