os.environ 初始化在哪里?
使用这段代码时,输出了很多键,但我原本以为不会有任何输出:
import os
for i in os.environ:
print i
这是来自 os.py 的代码:
try:
environ
except NameError:
environ = {}
os.environ 的值是从哪里来的?它是在哪里初始化的?
2 个回答
3
从os.py
中引用的代码是一个安全措施。它的意思是,如果还没有人定义过environ
这个变量,就创建一个,值是一个空的字典。
但是environ
是存在的,因为在第58行之前已经导入了它:
from nt import *
如果你在运行Windows系统,还有其他平台特定的导入。所以实际上,environ
总是存在的,那个空字典的安全措施根本不会被用到。
那为什么还要提供这个安全措施呢?其实在现实中用处不大,因为我看到的所有当前由核心Python支持的平台都实现了正确的environ
查找。不过,可能有一些不常见的平台,Python在上面运行时没有环境变量,而在开发新平台时,如果系统接口像环境变量还没有写好,这样的安全措施可能会有用,能避免很多程序因为找不到环境变量而无法运行。
7
os
模块的工作是先从一个特定平台的子模块(比如_nt
或_posix
)导入所有的名称,然后进行一些简单的整理。很明显,environ
这个名字(代表系统环境)是由那个特定平台的子模块定义的(这通常是应该的!!!),所以在os.py
中的except
语句没有被触发,os.environ
就是一个正常情况下应该有的丰富字典。