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

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

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


当前回答

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

os.getenv()不会引发异常,而是返回None os. environment .get()同样返回None 操作系统。如果环境变量不存在,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. environment .get的一个简单包装。

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

os.getenv()不会引发异常,而是返回None os. environment .get()同样返回None 操作系统。如果环境变量不存在,Environ[]将引发异常

而os. environment .get和os. get在功能上没有区别。Getenv, os和os之间有很大的不同。Putenv和os.environ上的设置项。操作系统。Putenv是坏的,所以你应该默认os. environment .get,以避免os. environment .get。Getenv鼓励您使用操作系统。普捷夫对称。

操作系统。putenv改变了实际的操作系统级别的环境变量,但在某种程度上,它不会通过os。采用操作系统。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/任何你需要做的事情来避免启动配置,但这似乎很难做到。)

除了以上的答案:

$ 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

编辑:意思是,没有区别

请看这个相关的帖子。基本上,操作系统。Environ是在导入时找到的,而os. Environ是在导入时找到的。Getenv是os.environ的包装器。至少在CPython中。

编辑:在CPython、os中响应注释。Getenv基本上是os. environment .get的快捷方式;因为操作系统。Environ是在os导入时加载的,只有在导入时,对 os.getenv。