[英]Difference between os.getenv and os.environ.get
這兩種方法有什么區別嗎?
>>> 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.environ
是在導入時找到的,而os.getenv
是os.environ.get
的包裝器,至少在 CPython 中是這樣。
編輯:為了回應評論,在 CPython 中, os.getenv
基本上是os.environ.get
的快捷方式; 由於os.environ
是在os
導入時加載的,只有這樣, os.getenv
也是os.getenv
。
getenv()
和environ[]
之間的一個區別(在 Python 2.7 和 3.8 中觀察到getenv()
:
os.getenv()
不會引發異常,但返回 Noneos.environ.get()
同樣返回 Noneos.environ[]
會引發異常在帶有 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.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 調用才能查看真實的環境變量。 (啟動一個 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.