为什么python会在windows中大写所有环境变量

为什么python会在windows中大写所有环境变量,python,windows,Python,Windows,为什么os.environ在Windows上包含所有大写的环境变量?我不明白为什么(仅在Windows上)它不使用定义的相同大小写加载它们 是否存在os.environment的等效实现,该实现在不修改Windows环境变量信息的情况下加载环境变量信息 谢谢,因为Windows环境变量不区分大小写,但是Python字典区分大小写。通过将所有条目大写,您可以确保始终能够匹配条目 引用Python的话: 请注意,os.environ对象将所有访问转换为大写,包括搜索: def __setitem__

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

是否存在os.environment的等效实现,该实现在不修改Windows环境变量信息的情况下加载环境变量信息


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

引用Python的话:

请注意,
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']

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

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


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

Windows环境变量名称不区分大小写。这可能就是为什么。相关:好的,你知道有没有办法在python上获取原始环境变量键/值?我正在运行一个程序(使用twisted),该程序以区分大小写的方式读取环境变量,因此找不到windir,因为我们将其作为windir传递。@MariangeMarcano:这不是问题所在;
os.environ
对象也将进行大写搜索。@MariangeMarcano:然后向我们展示如何调用其他程序的代码。问题不是
os.environ['WINDIR']
os.environ['WINDIR']
;在Windows上,这两个语句是等效的。当然,我同意这不是问题所在,我们使用CI/buildbot运行构建,我们调用jamplus脚本(问题是jamplus以区分大小写的方式读取环境变量)buildbot以这种方式从twisted.internet导入。。。。return reactor.spawnProcess(processProtocol,executable,argv,env,path,usePTY=usePTY)env param具有我们从os.environ读取的内容,在运行jamplusIt时导致大写问题对于Windows程序(如Python)来说仍然不适合更改用户设置的环境变量的大小写,因为Windows环境变量名保留大小写。
>>> 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']