2013-09-26 293 views
3

os.environ是否有任何理由在Windows上包含所有環境變量大寫?我不明白爲什麼(僅在Windows上)它不會在使用相同大小寫的情況下加載它們它是如何定義的?爲什麼python大寫windows中的所有環境變量

是否有等效的os.environment實現,它可以加載環境變量信息而不用修改它們的Windows?

感謝

+0

Windows環境變量名稱不區分大小寫。這可能是_why_的答案。 – Carsten

+0

相關:[python環境案例敏感性 - os.environ \ [... \]](http://stackoverflow.com/q/7797269) –

回答

4

因爲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 

這是由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'] 
+0

好吧,你知道如果有一種方法來獲取原始環境變量鍵/值在Python?我正在運行一個程序(用扭曲的方式)以區分大小寫的方式讀取環境變量,所以它沒有找到windir,因爲我們將它作爲WINDIR傳遞。 – MariangeMarcano

+0

@MariangeMarcano:那不是問題; 'os.environ' *對象*也會進行大寫搜索。 –

+0

問題是我們沒有使用python來搜索環境變量。我們調用另一個程序。 – MariangeMarcano