web-dev-qa-db-ja.com

環境変数が存在するかどうかをチェックするための良い方法は何ですか?

Pythonで"FOO"などの変数の存在について自分の環境をチェックしたいです。この目的のために、私はos標準ライブラリを使用しています。図書館の資料を読んだ後、私は自分の目標を達成するための2つの方法を考え出しました。

方法1:

if "FOO" in os.environ:
    pass

方法2:

if os.getenv("FOO") is not None:
    pass

どちらの方法が良い/好ましい条件であるか、またその理由を知りたいのですが。

86
Kshitij Saraogi

最初を使用してください。何かがenvironで定義されているかどうかを直接チェックしようとします。 2番目の形式も同様に機能しますが、値が存在する場合は値が返され、onlyと比較するために使用されるため、意味的に欠けています。

environに存在するかどうかを確認しようとしているのですが、比較のためだけにgetが必要です。それを捨てる

それがまさにgetenvがすることです。

環境変数を取得し、存在しない場合はNoneを返します。オプションの2番目の引数は、代替のデフォルトを指定できます。

(これはあなたのチェックがif getenv("FOO")であることも意味します)

取得したくない、存在を確認したいのです。

どちらにしても、getenvenviron.getの単なるラッパーですが、次のようにマッピングのメンバーシップをチェックしている人はいないでしょう。

from os import environ
if environ.get('Foo') is not None:

要約すると、

if "FOO" in os.environ:
    pass

もしちょうどが存在を確認したいのであれば、実際にあなたが得るかもしれない値で何かをしたいのであればgetenv("FOO")を使用してください。

105

どちらの解決策でも、環境変数の存在を条件として何をしたいのかによって異なります。

ケース1

その値を気にせずに、純粋に環境変数の存在に基づいてさまざまなアクションを実行したい場合は、最初の解決策がベストプラクティスです。それはあなたが何をテストしているのかを簡潔に説明しています:環境変数のリストの中の 'FOO'です。

if 'KITTEN_ALLERGY' in os.environ:
    buy_puppy()
else:
    buy_kitten()

ケース2

値が環境変数で定義されていない場合にデフォルト値を設定したい場合、2番目の解決策は実際には有用ですが、あなたが書いた形式ではありません。

server = os.getenv('MY_CAT_STREAMS', 'youtube.com')

多分

server = os.environ.get('MY_CAT_STREAMS', 'youtube.com')

アプリケーションにいくつかのオプションがある場合は、 ChainMap を調べるとよいでしょう。これにより、キーに基づいて複数の辞書をマージすることができます。 ChainMapのドキュメントにこの例があります。

[...]
combined = ChainMap(command_line_args, os.environ, defaults)
14
hugovdberg

安全側にいるために

os.getenv('FOO') or 'bar'

上記の答えのコーナーケースは、環境変数が設定されているが空の場合です。

この特別な場合には

print(os.getenv('FOO', 'bar'))
# prints new line - though you expected `bar`

または

if "FOO" in os.environ:
    print("FOO is here")
# prints FOO is here - however its not

これを避けるためには、単にorを使ってください。

os.getenv('FOO') or 'bar'

それならあなたは

print(os.getenv('FOO') or 'bar')
# bar

空の環境変数があるのはいつですか?

.envファイルに値を設定するのを忘れました

# .env
FOO=

またはとしてエクスポート

$ export FOO=

またはsettings.pyに設定するのを忘れた

# settings.py
os.environ['FOO'] = ''

更新:疑問がある場合は、これらのワンライナーをチェックしてください。

>>> import os; os.environ['FOO'] = ''; print(os.getenv('FOO', 'bar'))

$ FOO= python -c "import os; print(os.getenv('FOO', 'bar'))"
6
Levon