6

Windows で os.environ にすべての環境変数が大文字で含まれている理由はありますか?

Windows用に変更せずに環境変数情報をロードする os.environment の同等の実装はありますか?

ありがとう

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

これは、OS から渡された未加工の初期辞書です。

>>> 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 に答える