os.environ ['foo']什么时候不匹配os.getenv('foo')?

Ben*_*ack 34 python windows freebsd environment-variables

我有一个小的Python应用程序,通过启动subprocess.Popen,以环境变量的形式获取一些参数.我通过将环境结构传递给Popen调用来完成此操作.然后程序通过读取变量os.getenv.

或者更确切地说,它曾经以这种方式阅读它们.在Windows上,它工作正常.但是在我们的FreeBSD服务器上,os.getenv返回None我们传入的所有参数.奇怪的是,os.environ它的值很好 - 实际上,简单地切换所有os.getenv('foo')调用,os.environ['foo']使得两个平台上的一切都正常工作.

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

JAB*_*JAB 22

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上的实现有一些奇怪的噱头导致它采取不同的行为,但我不确定为什么会出现这种情况.os.py如果可以的话,看看你使用的一台FreeBSD机器的副本.

  • @arvindpdmn经过另一次检查,那是因为`putenv()`实际上并没有将环境变量存储在`os.environ`中; 相反,`ENVIRON .__ setitem __()`调用`运行putenv()`也是在本地存储数据,并没有`的getenv()',也不'ENVIRON .__的GetItem __()`实际上查询环境本身,他们经营过任何`操作系统.environ`已存储.相当混乱的方式来实现它. (3认同)