os.environ是否有任何理由在Windows上包含所有环境变量大写?我不明白为什么(仅在Windows上)它不会使用与定义相同的情况加载它们?
是否有一个等效的os.environment实现加载环境变量信息而不为Windows修改它们?
感谢
答案 0 :(得分:5)
因为Windows环境变量是不敏感的,但Python字典区分大小写。通过高举所有条目,您可以确保始终能够匹配条目。
引用Python os.py
source code:
elif name in ('os2', 'nt'): # Where Env Var Names Must Be UPPERCASE
# But we store them as upper case
# ...
else: # Where Env Var Names Can Be Mixed Case
请注意,os.environ
对象将所有访问权限转换为大写,包括搜索:
def __setitem__(self, key, item):
putenv(key, item)
self.data[key.upper()] = item
def __getitem__(self, key):
return self.data[key.upper()]
# ...
def has_key(self, key):
return key.upper() in self.data
def __contains__(self, key):
return key.upper() in self.data
def get(self, key, failobj=None):
return self.data.get(key.upper(), failobj)
这意味着如果程序找不到os.environ['windir']
,则值未设置。
如果您 有权访问原始值,请从nt
模块中获取它们:
import nt
nt.environ
这是操作系统传入的原始初始字典,未经改动:
>>> import nt
>>> sorted(nt.environ.keys())
['ALLUSERSPROFILE', 'APPDATA', 'COMPUTERNAME', 'ComSpec', 'CommonProgramFiles', 'CommonProgramFiles(x86)', 'CommonProgramW6432', 'FP_NO_HOST_CHECK', 'HOMEDRIVE', 'HOMEPATH', 'LOCALAPPDATA', 'LOGONSERVER', 'NUMBER_OF_PROCESSORS', 'OS', 'PATHEXT', 'PROCESSOR_ARCHITECTURE', 'PROCESSOR_IDENTIFIER', 'PROCESSOR_LEVEL', 'PROCESSOR_REVISION', 'PROMPT', 'PSModulePath', 'PUBLIC', 'Path', 'ProgramData', 'ProgramFiles', 'ProgramFiles(x86)', 'ProgramW6432', 'SESSIONNAME', 'SSH_AUTH_SOCK', 'SystemDrive', 'SystemRoot', 'TEMP', 'TMP', 'USERDNSDOMAIN', 'USERDOMAIN', 'USERNAME', 'USERPROFILE', 'windir', 'windows_tracing_flags', 'windows_tracing_logfile']
答案 1 :(得分:1)
Windows不区分大小写是一种痛苦。他们为什么要那样做?您可以理解为什么搜索不区分大小写,但是在大多数情况下,定义的内容应保留确切的值。为什么?从经验来看,它会导致很多问题。我从未遇到过一个我想过的问题:“哦,为什么不大写还是小写呢?”。
从Python的角度来看,他们为什么要这样做? Windows敏感地存储键大小写,我猜只有一些函数以不区分大小写的方式获取值,因为我知道并非所有访问函数都可以。我认为MKS可以分辨出差异。
请勿在界面中强制使用特定于平台的行为(并应谨慎对待其他行为)。如有必要,提供一种替代方法来强制不区分大小写。