什么时候os.environ 不符合os.getenv('foo')?

我有一个小的Python应用程序,通过subprocess.Popen启动,它以环境variables的forms接受一些参数。 我通过将环境结构传递给Popen调用来做到这一点。 程序然后通过os.getenv读取variables。

或者说,它曾经以这种方式读取它们。 在Windows上,它工作正常。 但是在我们的FreeBSD服务器上, os.getenv对于我们传入的所有参数都返回None 。奇怪的是, os.environ的值很好 – 事实上,只需将所有os.getenv('foo')调用切换到os.environ['foo']两个平台上都能正常工作。

为什么这些价值观不同? 什么时候适合于另一个?

os.environ是在os模块导入时创建的,并不反映后来发生的环境变化,除非直接修改。 有趣的是, os.getenv()实际上并没有得到最新的环境变量,至少在CPython中没有。 你看,在CPython中, os.getenv()显然只是os.environ.get()一个包装(参见http://hg.python.org/cpython/file/6671c5039e15/Lib/os.py#l646 ) 。 所以看起来,使用os.getenv()与指定的实现的主要原因是当你想有一个默认值的时候返回一个环境变量的名字是不是在os.environ的键找到,而不是有一个KeyError或任何抛出,你想保存几个字符。

在FreeBSD上的实现完全有可能有一些奇怪的噱头,导致它的行为不同,但我不知道为什么会这样。 如果可以,请查看您使用的FreeBSD机器上的os.py副本。