回答:
観察された1つの違い(Python27):
os.environ
環境変数が存在しない場合は、例外が発生します。
os.getenv
例外は発生しませんが、Noneを返します
os.environ.get()
vs について尋ねますos.getenv()
が、本文にはos.environ
vs も含まれているos.environ.get()
ため、この回答は少なくともいくつかの点で正しいです-不完全ですが正しい。
この関連スレッドを参照してください。基本的にos.environ
は、インポート時に見つかり、少なくともCPythonではos.getenv
へのラッパーos.environ.get
です。
編集:CPythonでは、コメントに応答することos.getenv
は基本的にへのショートカットos.environ.get
です。以降は、os.environ
輸入時にロードされos
、そしてだけにして、同じことが成り立ちます
os.getenv
。
os.getenv()
[...] を使用する主な理由os.environ
は、KeyError
やその他のものがスローされるのではなく、のキーに環境変数名が見つからないときにデフォルト値が返されるようにする場合です。いくつかのキャラクターを保存したい。」
Python 2.7とiPython:
>>> 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')
を呼び出したgetenv
後に実際の環境変数を確認するには、Cレベルでctypesを呼び出す必要がありますos.putenv
。(シェルサブプロセスを起動し、その環境変数を要求することも機能する可能性があります。エスケープおよび--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の場合は例外を発生させません。var。存在しません。あなたが混乱していることと、os.environ['TERM']
それが問題ではないことを使っていること。