簡體   English   中英

os.environ ['foo']什么時候不匹配os.getenv('foo')?

[英]When would os.environ['foo'] not match os.getenv('foo')?

我有一個小的Python應用程序,通過subprocess.Popen啟動,它以環境變量的形式獲取一些參數。 我通過將環境結構傳遞給Popen調用來完成此操作。 然后程序通過os.getenv讀取變量。

或者更確切地說,它曾經以這種方式閱讀它們。 在Windows上,它工作正常。 但是在我們的FreeBSD服務器上, os.getenv為我們傳入的所有參數返回None 。奇怪的是os.environ的值很好 - 事實上,只需將所有os.getenv('foo')調用切換到os.environ['foo']使一切在兩個平台上運行良好。

為什么這些值不同? 什么時候適合另一個?

os.environ是在導入os模塊時創建的,除非直接修改,否則不會反映之后發生的環境變化。 然而,有趣的是, os.getenv()實際上並沒有獲得最新的環境變量,至少在CPython中沒有。 你看,在CPython中, os.getenv()顯然只是os.environ.get()的包裝器(參見http://hg.python.org/cpython/file/6671c5039e15/Lib/os.py#l646 ) 。 因此,似乎將os.getenv()與所述實現一起使用的os.getenv()是當你想要在os.environ的鍵中找不到環境變量名時返回默認值而不是KeyError或者其他什么拋出,你想保存幾個字符。

完全有可能FreeBSD上的實現有一些奇怪的噱頭導致它采取不同的行為,但我不確定為什么會出現這種情況。 如果可以的話,看看你使用的一台FreeBSD機器上的os.py副本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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