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

Mar*_*ano 3 python windows

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

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

谢谢

Mar*_*ers 5

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

引用Python os.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
Run Code Online (Sandbox Code Playgroud)

请注意,该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)
Run Code Online (Sandbox Code Playgroud)

这意味着如果程序找不到os.environ['windir'],则不设置该值.

如果您必须能够访问原始值,请从nt模块中获取它们:

import nt
nt.environ
Run Code Online (Sandbox Code Playgroud)

这是操作系统传入的原始初始字典,没有改变:

>>> 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']
Run Code Online (Sandbox Code Playgroud)

  • 对于Windows程序(例如Python)来说,更改用户设置的环境变量的大小写仍然是不合适的,因为Windows环境变量名称是保留大小写的. (3认同)