269

Is there any difference at all between both approaches?

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

They seem to have the exact same functionality.

4

5 回答 5

146

See this related thread. Basically, os.environ is found on import, and os.getenv is a wrapper to os.environ.get, at least in CPython.

EDIT: To respond to a comment, in CPython, os.getenv is basically a shortcut to os.environ.get ; since os.environ is loaded at import of os, and only then, the same holds for os.getenv.

于 2013-06-04T18:04:01.543 回答
108

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

  • os.getenv()不引发异常,但返回 None
  • os.environ.get()同样返回无
  • os.environ[]如果环境变量不存在则引发异常
于 2017-01-13T02:13:20.397 回答
48

在带有 iPython 的 Python 2.7 中:

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

于 2017-02-05T22:48:38.923 回答
44

os.environ.get虽然和之间没有功能上的区别,但在和 设置条目之间os.getenv存在巨大差异。已损坏,因此您应该默认为简单地避免鼓励您使用对称的方式。os.putenvos.environos.putenvos.environ.getos.getenvos.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')

您可能必须对 C 级别getenv进行 ctypes 调用才能在调用os.putenv. (启动一个 shell 子进程并询问它的环境变量也可能有效,如果您非常小心转义和--norc//--noprofile为避免启动配置而需要做的任何其他事情,但要正确似乎要困难得多。)

于 2019-05-01T17:53:43.610 回答
2

除了上面的答案:

$ 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

编辑:意思,没有区别

于 2018-12-23T14:34:06.477 回答