web-dev-qa-db-ja.com

os.getenvと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

それらはまったく同じ機能を持っているようです。

110
André Staltz

観察された1つの違い(Python27):

os.environは、環境変数が存在しない場合に例外を発生させます。 os.getenvは例外を発生させませんが、Noneを返します

38
giwyni

この関連スレッド を参照してください。基本的に、os.environはインポート時に見つかり、os.getenvは少なくともCPythonではos.environ.getのラッパーです。

編集:コメントに応答するには、CPythonでは、os.getenvは基本的にos.environ.getへのショートカットです。 os.environosのインポート時にロードされるため、その場合のみ、os.getenvにも同じことが当てはまります。

54

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.getenvos.environ.getの単なる単純なラッパーであると結論付けることができます。

29
Zulu

上記の答えに加えて:

$ 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
3
fredrik

os.environ.getos.getenvの間に機能的な違いはありませんが、os.putenvos.environのエントリの設定にはmassiveの違いがあります。 os.putenv壊れたなので、対称のためにos.environ.getos.getenvを使用することを奨励する方法を避けるために、デフォルトでos.putenvを使用する必要があります。

os.putenvは、実際のOSレベルの環境変数を変更しますが、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を呼び出す必要があります。 (シェルのサブプロセスを起動して環境変数を要求することも、エスケープや--norc/--noprofile //その他のスタートアップ構成を避けるために非常に注意している場合にはうまくいくかもしれませんが、正しくするのはずっと難しいようです。 )

2
user2357112