os之间的区别。Getenv和os. environment .get

这两种方法之间有什么区别吗?

>>> 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

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

237696 次浏览

看到这个相关的线程。基本上,os.environ是在导入时找到的,而os.getenvos.environ.get的包装器,至少在CPython中是这样。

EDIT:在CPython中,为了响应注释,os.getenv基本上是os.environ.get的快捷方式;因为os.environ是在导入os时加载的,只有在那时,同样适用于 os.getenv . < / p >

getenv()environ[]之间的一个区别(在Python 2.7和3.8中观察到):

  • os.getenv()不会引发异常,而是返回None
  • os.environ.get()同样返回None
  • 如果环境变量不存在,os.environ[]将引发异常

在Python 2.7中使用iPython:

>>> import os
>>> os.getenv??
Signature: os.getenv(key, default=None)
Source:
def getenv(key, default=None):
"""Get an environment variable, return None if it doesn't exist.
The optional second argument can specify an alternate default."""
return environ.get(key, default)
File:      ~/venv/lib/python2.7/os.py
Type:      function

因此,我们可以得出结论:os.getenv只是os.environ.get的一个简单包装。

除了以上的答案:

$ 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

编辑:意思是,没有区别

虽然在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')

在调用os.putenv之后,你可能不得不对c级getenv进行ctypes调用,以查看真正的环境变量。(启动一个shell子进程并请求它的环境变量也可以工作,如果你非常注意转义和--norc/--noprofile/其他你需要做的事情来避免启动配置,但这似乎很难做到正确。)