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

And*_*ltz 128 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
Run Code Online (Sandbox Code Playgroud)

小智 58

请参阅此相关主题.基本上,os.environ是在导入时找到的,至少在CPython中os.getenv是包装器os.environ.get.

编辑:回应评论,在CPython中,os.getenv基本上是一个快捷方式os.environ.get; 因为os.environ在导入时加载os,只有这样,同样适用 os.getenv.

  • `os.environ.get` 不会抛出 `KeyError`。 (14认同)
  • 确实,根据官方文档:https://docs.python.org/3/library/os.html (2认同)
  • 从链接的相关线程:“使用 `os.getenv()` [...] 的主要原因是当您在 `os.environ` 中找不到环境变量名称时希望返回默认值” s 键而不是抛出 `KeyError` 或任何抛出的错误,并且您想保存一些字符。” (2认同)

giw*_*yni 39

观察到一个差异(Python27):

os.environ如果环境变量不存在则引发异常. os.getenv不引发异常,但返回None

  • OP询问`os.environ.get()`,它返回`None`(除非另有说明),如果env,则不会引发异常.变种.不存在.你使用`os.environ ['TERM']的令人困惑的事情,这不是问题所在. (88认同)
  • 这个不正确且具有误导性的答案应该受到否决票。下一个答案是正确的。 (11认同)
  • OP的*问题*询问`os.environ.get()`与`os.getenv()`,但*正文*还包括`os.environ`与`os.environ.get()`,所以这个答案至少在某些方面是正确的——不完整,但正确。 (7认同)

Zul*_*ulu 35

在使用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
Run Code Online (Sandbox Code Playgroud)

所以我们可以得出结论os.getenv只是一个简单的包装器os.environ.get.

  • @thanos.a 我使用 iPython 语法 (2认同)

fre*_*rik 9

除了上面的答案之外:

$ 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
Run Code Online (Sandbox Code Playgroud)

编辑:意思,没有区别

  • 完全无关。单个函数调用的微优化......无论如何,任何应用程序都应该仅在引导程序上读取环境,这使得这更加无关紧要。 (36认同)
  • 顺便说一句,“usec”是“timeit”中的_微秒_。在这个微基准测试中发现的差异是 0.18 微秒...... (7认同)

use*_*ica 8

os.environ.get和之间没有功能上的区别os.getenv,但在和上设置条目之间却存在巨大差异。已损坏,因此您应默认设置为简单地避免鼓励您使用对称性的方法。os.putenvos.environos.putenvos.environ.getos.getenvos.putenv

os.putenv改变实际的OS级的环境变量,但在某种程度上,它不是通过露面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')
Run Code Online (Sandbox Code Playgroud)

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