如何在 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