CPython如何实现os.environ?
How does CPython implement os.environ?
我正在浏览 source 并注意到它在定义之前在方法中引用了一个变量 environ
:
def _createenviron():
if name == 'nt':
# Where Env Var Names Must Be UPPERCASE
def check_str(value):
if not isinstance(value, str):
raise TypeError("str expected, not %s" % type(value).__name__)
return value
encode = check_str
decode = str
def encodekey(key):
return encode(key).upper()
data = {}
for key, value in environ.items():
data[encodekey(key)] = value
else:
# Where Env Var Names Can Be Mixed Case
encoding = sys.getfilesystemencoding()
def encode(value):
if not isinstance(value, str):
raise TypeError("str expected, not %s" % type(value).__name__)
return value.encode(encoding, 'surrogateescape')
def decode(value):
return value.decode(encoding, 'surrogateescape')
encodekey = encode
data = environ
return _Environ(data,
encodekey, decode,
encode, decode)
# unicode environ
environ = _createenviron()
del _createenviron
那么 environ
如何设置?我似乎无法推断它的初始化和声明位置,以便 _createenviron
可以使用它?
TLDR 在 os
模块内容中搜索 from posix import *
。
os
模块从 posix
(Unix) 或 nt
(Windows) low-level 模块导入所有 public 符号os.py
.
的开头
posix
将 environ
公开为普通的 Python dict
。
os
用 _Environ
dict-like 对象包装它,在 _Environ
项目发生变化时更新环境变量。
我正在浏览 source 并注意到它在定义之前在方法中引用了一个变量 environ
:
def _createenviron():
if name == 'nt':
# Where Env Var Names Must Be UPPERCASE
def check_str(value):
if not isinstance(value, str):
raise TypeError("str expected, not %s" % type(value).__name__)
return value
encode = check_str
decode = str
def encodekey(key):
return encode(key).upper()
data = {}
for key, value in environ.items():
data[encodekey(key)] = value
else:
# Where Env Var Names Can Be Mixed Case
encoding = sys.getfilesystemencoding()
def encode(value):
if not isinstance(value, str):
raise TypeError("str expected, not %s" % type(value).__name__)
return value.encode(encoding, 'surrogateescape')
def decode(value):
return value.decode(encoding, 'surrogateescape')
encodekey = encode
data = environ
return _Environ(data,
encodekey, decode,
encode, decode)
# unicode environ
environ = _createenviron()
del _createenviron
那么 environ
如何设置?我似乎无法推断它的初始化和声明位置,以便 _createenviron
可以使用它?
TLDR 在 os
模块内容中搜索 from posix import *
。
os
模块从 posix
(Unix) 或 nt
(Windows) low-level 模块导入所有 public 符号os.py
.
posix
将 environ
公开为普通的 Python dict
。
os
用 _Environ
dict-like 对象包装它,在 _Environ
项目发生变化时更新环境变量。