如何在 Python 中訪問環境變數

環境變數

環境變數是為 Python 程式外部分配值的變數。開發人員通常在呼叫 Python 可執行檔案之前在命令列上進行設定。然後,作業系統使 Python 程式可從內部訪問這些變數。

環境變數的存在提高了程式靈活性。使用者可以在程式執行之前更改特定的引數,並且程式將能夠檢視這些引數並動態修改其行為,這一些都不需要修改程式碼,將環境變數的這種使用稱為程式配置。

Python 中的環境變數

設定環境變數的機制取決於作業系統。因此,它們可以通過 Python 的內建 os 模組使用,該模組抽象出了依賴於作業系統的功能。

Python 執行時將程式的所有環境變數保留在類似字典的 os.environ 物件中。

請注意,os.environ 物件在當 Python 執行載入 os 模組時被填充。如果你嘗試在事後更改環境變數(例如,通過在 terminal 中匯出新的環境變數),它不會起作用的。

讀取環境變數

通過在 os.environ 物件上執行類似字典的操作來訪問 Python 中的環境變數。

>>> import os
>>> os.environ
environ({'HOME': '/Users/john', 'LANG': 'en_US.UTF-8', 'LOGNAME': 'john', 'OLDPWD': '/Users/john', 'PATH': '/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin', 'PWD': '/Users/john/python-tutorial', 'SHELL': '/bin/zsh', 'TERM': 'screen', 'TERM_PROGRAM': 'Apple_Terminal', 'TERM_PROGRAM_VERSION': '433', 'TERM_SESSION_ID': 'CDC91EF3-15D6-41AD-A17B-E959D97BC4B5', 'TMPDIR': '/var/folders/md/31nwv67j113d19z0_1287f1r0000gn/T/', 'TMUX': '/private/tmp/tmux-501/default,3319,0', 'TMUX_PANE': '%28' , 'USER': 'john', '_': '/usr/local/bin/python3', '__PYVENV_LAUNCHER__': '/usr/local/bin/python3'})
>>> os.environ['HOME']
'/Users/john'
>>> os.environ['LANG']
'en_US.UTF-8'

如果使用下標 [] 符號訪問環境變數,並且該變數未定義,則將出現執行時錯誤。

>>> os.environ['I_DONT_EXIST']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/Cellar/python/3.7.5/Frameworks/Python.framework/Versions/3.7/lib/python3.7/os.py", line 679, in __getitem__
    raise KeyError(key) from None
KeyError: 'I_DONT_EXIST'

為避免此問題,os.environ 可以使用 get() 介面從物件讀取。如果尚未定義查詢的環境變數,則 get() 返回 None

>>> result = os.environ.get('I_DONT_EXIST')
>>> print(result)
None

get() 方法的一個便利功能是,你可以指定一個預設值,以防在環境變數中搜尋找不到時候返回此預設值。

>>> os.environ.get('I_DONT_EXIST', 'I_AM_DEFAULT')
'I AM DEFAULT'

替代 os.environ.get() 的方法是使用 os.getenv() 功能。這兩個函式的工作原理相同,你可以將後者視為便捷的 API。

寫環境變數

有時你需要在程式中更改環境變數。例如,如果你需要在收到配置網路請求時修改應用程式的行為,則可能會發生這種情況。你可以使用下標 [] 運算子來更改環境變數,就像使用 os.environ 標準字典一樣。

>>> import os
>>> os.environ['LANG']
'en_US.UTF-8'
>>> os.environ['LANG'] = 'en_GB.UTF-8'
>>> os.environ['LANG']
'en_GB.UTF-8'

請注意,環境變數值應為字串型別。如果你嘗試將整數或任何其他非字串值分配給環境變數,則會出現執行時錯誤。

>>> import os
>>> os.environ['LANG'] = 4
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/Cellar/python/3.7.5/Frameworks/Python.framework/Versions/3.7/lib/python3.7/os.py", line 684, in __setitem__
    value = self.encodevalue(value)
  File "/usr/local/Cellar/python/3.7.5/Frameworks/Python.framework/Versions/3.7/lib/python3.7/os.py", line 754, in encode
    raise TypeError("str expected, not %s" % type(value).__name__)
TypeError: str expected, not int
comments powered by Disqus