両方のアプローチに何か違いはありますか?
>>> 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
それらはまったく同じ機能を持っているようです。
観察された1つの違い(Python27):
os.environ
は、環境変数が存在しない場合に例外を発生させます。 os.getenv
は例外を発生させませんが、Noneを返します
この関連スレッド を参照してください。基本的に、os.environ
はインポート時に見つかり、os.getenv
は少なくともCPythonではos.environ.get
のラッパーです。
編集:コメントに応答するには、CPythonでは、os.getenv
は基本的にos.environ.get
へのショートカットです。 os.environ
はos
のインポート時にロードされるため、その場合のみ、os.getenv
にも同じことが当てはまります。
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
の単なる単純なラッパーであると結論付けることができます。
上記の答えに加えて:
$ 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.environ.get
とos.getenv
の間に機能的な違いはありませんが、os.putenv
とos.environ
のエントリの設定にはmassiveの違いがあります。 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')
os.putenv
を呼び出した後、実際の環境変数を確認するには、Cレベルのgetenv
に対してctypesを呼び出す必要があります。 (シェルのサブプロセスを起動して環境変数を要求することも、エスケープや--norc
/--noprofile
//その他のスタートアップ構成を避けるために非常に注意している場合にはうまくいくかもしれませんが、正しくするのはずっと難しいようです。 )