os.getenv 和 os.environ.get 的区别

Posted

技术标签:

【中文标题】os.getenv 和 os.environ.get 的区别【英文标题】:Difference between os.getenv and os.environ.get 【发布时间】:2013-05-31 05:46:50 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

见this related thread。基本上,os.environ 是在导入时找到的,os.getenvos.environ.get 的包装器,至少在 CPython 中是这样。

编辑:要回复评论,在 CPython 中,os.getenv 基本上是 os.environ.get 的快捷方式;因为os.environ 是在os 的导入时加载的,只有这样,对于 os.getenv.

【讨论】:

确实如此,根据官方文档:docs.python.org/3/library/os.html 来自链接的相关线程:“使用os.getenv() [...] 的主要原因是当您希望在@987654332 中找不到环境变量名称时返回默认值@ 的键而不是 KeyError 或任何抛出的东西,你想保存几个字符。" os.environ.get 不会抛出 KeyError【参考方案2】:

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

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

【讨论】:

OP 询问 os.environ.get(),它返回 None(除非指定不同)并且如果 env.变种。不存在。您对使用 os.environ['TERM'] 感到困惑的事情不是问题所在。 OP 的 question 询问 os.environ.get()os.getenv()body 还包括 os.environos.environ.get() 所以这个答案至少在某些方面是正确的——不完整,但正确。 这个不正确且具有误导性的答案应该得到否定的反对票。下一个答案是正确的。 有人编辑了这个答案来“修复”它,现在有一堆旧的反对票和 cmets... .【参考方案3】:

在带有 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 的简单包装。

【讨论】:

在 python3 中,当我做 os.getenv??我收到以下错误文件“”,第 1 行 os.getenv?? @thanos.a 我使用 iPython 语法【参考方案4】:

虽然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 调用才能查看真正的环境变量。 (如果您非常小心转义和--norc/--noprofile/为了避免启动配置而需要做的任何其他事情,那么启动一个shell子进程并询问它的环境变量也可能会起作用,但这似乎要困难得多正确。)

【讨论】:

【参考方案5】:

除了上面的答案:

$ 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

编辑:意思,没有区别

【讨论】:

您测试过哪个版本的 Python。在 3.7.2 上,os.getenv 只是 os.environ.get 的包装,所以我得到的开销非常小。 那是 macOS Mojave 上的 3.7.1。时间安排相当一致。 @PreslavRachev 最小或不是它是一个额外的函数调用,所以有一些开销。话虽如此,您可能不需要在内部循环中间检索环境变量。 完全不相关。单个函数调用的微优化......无论如何,任何应用程序都应该只在引导时读取环境,这使得这更加无关紧要。 顺便说一句,usectimeit 中的 微秒。在这个微基准测试中发现的差异是 0.18 微秒......

以上是关于os.getenv 和 os.environ.get 的区别的主要内容,如果未能解决你的问题,请参考以下文章

os.GetEnv()在设置env变量后不起作用

Python os.getenv() 在设置 Windows 环境变量时返回 None

python os.getenv 看不到 ~/.profile 中定义的变量

openresty中的set_by_lua&os.getenv:alpine docker container

PostgreSQL,plpython3u函数。 os.getenv找不到环境变量

python 操作文件和目录