6

os.environ 是否有任何理由在 Windows 上包含所有大写的环境变量?,我不明白为什么(仅在 Windows 上)它不使用与定义相同的大小写来加载它们?

是否有 os.environment 的等效实现可以加载环境变量信息而不为 Windows 修改它们?

谢谢

4

2 回答 2

7

因为 Windows 环境变量不区分大小写,但 Python 字典区分大小写。通过将所有条目大写,您可以确保始终能够匹配条目。

引用 Pythonos.py源代码

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']
于 2013-09-26T08:38:58.403 回答
1

Windows 不区分大小写是一种痛苦。他们为什么要那样做?您可以理解为什么搜索应该不区分大小写,但在大多数情况下,定义的内容应该保持准确的值。为什么?好吧,从经验来看,它会导致很多问题。我从来没有遇到过我想过的问题,“哦,为什么不是大写或小写?”。

从 Python 的角度来看,他们为什么要这样做?Windows 存储密钥大小写敏感,我猜只有一些函数以不区分大小写的方式获取值,因为我知道并非所有访问函数都这样做。我认为 MKS 可以区分。

不要在界面中强制执行特定于平台的行为(并小心强制执行其他行为)。如果需要,请提供一种替代方法来强制不区分大小写。

于 2018-06-27T07:39:52.727 回答