我有一个小型Python应用程序,通过subprocess.Popen
启动,它以环境变量的形式获取一些参数。我通过将环境结构传递到Popen
调用来完成此操作。然后程序通过os.getenv
读取变量。
或者更确切地说,它曾经以这种方式阅读它们。在Windows上,它工作正常。但是在我们的FreeBSD服务器上,os.getenv
为我们传入的所有参数返回None
。奇怪的是os.environ
的值很好 - 实际上,只是切换所有os.getenv('foo')
1}}对os.environ['foo']
的调用使得两个平台上的一切正常。
为什么这些值不同?什么时候适合另一个?
答案 0 :(得分:20)
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
的键中找不到环境变量名时返回默认值而不是{ {1}}或任何抛出的东西,你想保存几个字符。
完全有可能FreeBSD上的实现有一些奇怪的噱头导致它采取不同的行为,但我不确定为什么会出现这种情况。如果可以,请查看您使用的其中一台FreeBSD计算机上的KeyError
副本。