两种方法之间是否有任何差异?
>>> 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
它们似乎具有完全相同的功能。
答案 0 :(得分:52)
见this related thread。基本上,导入时会找到os.environ
,os.getenv
是os.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.get
和os.getenv
之间没有功能上的差异,但是os.putenv
和os.environ
上的设置项之间有大量差异。 os.putenv
被破坏了,因此您应该默认设置为os.environ.get
只是为了避免os.getenv
鼓励您使用os.putenv
进行对称的方式。
os.putenv
更改了实际的操作系统级环境变量,但以某种方式无法通过os.getenv
,os.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子进程并询问其环境变量也可能有效。似乎很难纠正。)