Python的os.environ在某些方面出乎意料的自由。

291 阅读2分钟

在 Python 程序中访问和修改 Unix 环境变量的方式通常是通过 os.environ;Python 3 是 Python 3,有时你需要 os.environb.在 Unix 中,什么可以进入环境是有些模糊的,虽然 Python 在字符编码方面有一些问题,但在其他方面,它在很多方面都是惊人的自由。

os.environ的第一个自由化方式是它允许环境变量有空白值:

>>> os.environ["FRED"] = ""
>>> subprocess.run("printenv")
[...]
FRED=
[...]

在一些 Unix shell 中也可以这样做,但传统上环境变量通常被认为是有非空值的。相当多的代码可能会认为空白值与变量未被设置是一样的,尽管在Python中你可以区分,因为如果环境变量根本不存在,os.environ 会引发KeyError

os.environ 的一个更大的自由度是,它允许你在环境变量的名称中使用非传统的字符:

>>> os.environ["FRED/BAR"] = "Yes"
>>> subprocess.run("printenv")
[...]
FRED/BAR=Yes

在 Unix 上,设置一个环境变量使用 setenv()来设置环境变量,这通常只要求你避免使用 '='。Python 特别检查你名字中的 '=',这样它就可以产生一个特定的错误,否则就会通过。

除此之外,Python 本身并不特别限制环境变量的名字。因此,你可以用环境变量名做各种奇怪的事情,包括把空格和 Unicode 放进去 (至少在 UTF-8 环境下)。一些或许多环境变量不会被shell程序访问,但不是所有解释环境的东西都遵循shell的规则。

我最近遇到的情况是在Dovecot的登录后脚本中,在某些情况下,它可能需要你创建名称中带有'/'的环境变量。典型的shells不允许这样做,但我很高兴地发现Python完全愿意去做,而且一切都很顺利。