簡體   English   中英

os.getenv 和 os.environ.get 的區別

[英]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.getenvos.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()不會引發異常,但返回 None
  • os.environ.get()同樣返回 None
  • 如果環境變量不存在, os.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.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 調用才能查看真實的環境變量。 (啟動一個 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM