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.getenv
是 os.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.environ
与 os.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??我收到以下错误文件“虽然os.environ.get
和os.getenv
之间没有功能差异,但os.putenv
和os.environ
上的设置条目之间存在巨大差异。 os.putenv
已损坏,因此您应该默认为 os.environ.get
,以避免 os.getenv
鼓励您使用 os.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')
在调用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 最小或不是它是一个额外的函数调用,所以有一些开销。话虽如此,您可能不需要在内部循环中间检索环境变量。
完全不相关。单个函数调用的微优化......无论如何,任何应用程序都应该只在引导时读取环境,这使得这更加无关紧要。
顺便说一句,usec
是 timeit
中的 微秒。在这个微基准测试中发现的差异是 0.18 微秒......以上是关于os.getenv 和 os.environ.get 的区别的主要内容,如果未能解决你的问题,请参考以下文章
Python os.getenv() 在设置 Windows 环境变量时返回 None
python os.getenv 看不到 ~/.profile 中定义的变量
openresty中的set_by_lua&os.getenv:alpine docker container