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


Answers:


60

观察到的一个区别(Python27):

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


119
OP询问有关os.environ.get()哪个返回None(除非有其他指定),并且如果env永不引发异常。变种 不存在。使用os.environ['TERM']哪个让您感到困惑的问题不是问题所在。
Anthon

2
OP的问题询问os.environ.get()vs,os.getenv()主体也包括os.environvs。os.environ.get()因此,此答案至少在某些方面是正确的-不完整,但正确。
FKEinternet '19

3
这个错误和误导性的答案应该得到了否定的否决。下一个答案是正确的。
RayLuo

80

请参阅此相关线程。基本上,os.environ可以在import上找到,并且至少在CPython中os.getenv是的包装os.environ.get

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


1
确实,根据官方文件:docs.python.org/3/library/os.html
ivanleoncz

1
在链接的相关主题中:“使用os.getenv()[...]的主要原因是,当您os.environ的键中没有找到环境变量名称而不是KeyError抛出环境变量名称时,您想返回默认值,并且您想要保存一些字符。”
mindthief

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

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


16

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

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


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

您测试过哪个版本的Python。在3.7.2上,os.getenv只是的包装os.environ.get,因此我得到的开销非常小。
Preslav Rachev

在macOS Mojave上为3.7.1。时间非常一致。
fredrik

@PreslavRachev是否最少,这是一个额外的函数调用,因此存在一些开销。话虽如此,您可能不需要在内部循环的中间检索环境变量。
pmav99

7
完全无关紧要。单个函数的微优化...任何应用程序无论如何都应该仅在引导程序上读取环境,从而使此操作变得更加无关紧要。
维克多·施罗德

1
BTW,usec是一个微秒timeit。在微基准测试中发现的差异为0.18微秒...
VictorSchröder19年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.