两种方法之间有什么区别吗?
>>> 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
它们似乎具有完全相同的功能。
两种方法之间有什么区别吗?
>>> 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
它们似乎具有完全相同的功能。
Answers:
观察到的一个区别(Python27):
os.environ
如果环境变量不存在,则会引发异常。
os.getenv
不引发异常,但返回None
os.environ.get()
vs,os.getenv()
但主体也包括os.environ
vs。os.environ.get()
因此,此答案至少在某些方面是正确的-不完整,但正确。
请参阅此相关线程。基本上,os.environ
可以在import上找到,并且至少在CPython中os.getenv
是的包装os.environ.get
。
编辑:在CPython中,响应评论os.getenv
基本上是os.environ.get
; 的快捷方式。因为os.environ
在导入时加载os
,只有这样,才适用
os.getenv
。
os.getenv()
[...]的主要原因是,当您os.environ
的键中没有找到环境变量名称而不是KeyError
抛出环境变量名称时,您想返回默认值,并且您想要保存一些字符。”
在带有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
。
os.environ.get
和之间没有功能上的区别os.getenv
,但在和上设置条目之间却存在巨大差异。已损坏,因此您应默认设置为仅避免使用鼓励您用于对称的方法。os.putenv
os.environ
os.putenv
os.environ.get
os.getenv
os.putenv
os.putenv
改变实际的OS级的环境变量,但在某种程度上,它不是通过露面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
/ / /其他任何操作都非常谨慎,则需要避免启动配置,但这似乎很难解决。)
除了以上答案:
$ 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
os.getenv
只是的包装os.environ.get
,因此我得到的开销非常小。
usec
是一个微秒在timeit
。在微基准测试中发现的差异为0.18微秒...
os.environ.get()
哪个返回None
(除非有其他指定),并且如果env永不引发异常。变种 不存在。使用os.environ['TERM']
哪个让您感到困惑的问题不是问题所在。