os.getenv和os.environ.get之间的区别

时间:2013-06-04 17:59:43

标签: python environment-variables python-os

两种方法之间是否有任何差异?

>>> os.getenv('TERM')
'xterm'
>>> os.environ.get('TERM')
'xterm'

>>> os.getenv('FOOBAR', "not found") == "not found"
True
>>> os.environ.get('FOOBAR', "not found") == "not found"
True

它们似乎具有完全相同的功能。

5 个答案:

答案 0 :(得分:52)

this related thread。基本上,导入时会找到os.environos.getenvos.environ.get的包装,至少在CPython中是这样。

编辑:要回复评论,在CPython中,os.getenv基本上是os.environ.get的捷径;因为os.environ是在导入os时加载的,只有这样,同样适用 os.getenv

答案 1 :(得分:36)

观察到一个差异(Python27):

如果环境变量不存在,

os.environ会引发异常。 os.getenv不会引发异常,但会返回None

答案 2 :(得分:28)

在带有iPython的Python 2.7中:

os.getenv

因此,我们可以得出结论os.environ.get只是{{1}}的简单包装。

答案 3 :(得分:3)

除了以上答案:

$ python3 -m timeit -s 'import os' 'os.environ.get("TERM_PROGRAM")'
200000 loops, best of 5: 1.65 usec per loop

$ python3 -m timeit -s 'import os' 'os.getenv("TERM_PROGRAM")'
200000 loops, best of 5: 1.83 usec per loop

答案 4 :(得分:1)

虽然os.environ.getos.getenv之间没有功能上的差异,但是os.putenvos.environ上的设置项之间有大量差异。 os.putenv破坏了,因此您应该默认设置为os.environ.get只是为了避免os.getenv鼓励您使用os.putenv进行对称的方式。

os.putenv更改了实际的操作系统级环境变量,但以某种方式无法通过os.getenvos.environ或任何其他检查环境变量的stdlib方法显示:

>>> import os
>>> os.environ['asdf'] = 'fdsa'
>>> os.environ['asdf']
'fdsa'
>>> os.putenv('aaaa', 'bbbb')
>>> os.getenv('aaaa')
>>> os.environ.get('aaaa')

您可能必须在调用getenv之后对C级os.putenv进行ctypes调用才能查看实际的环境变量。 (如果您非常谨慎地转义和--norc / --noprofile /其他需要避免启动配置的操作,则启动shell子进程并询问其环境变量也可能有效。似乎很难纠正。)