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


130

私の環境で、"FOO"Pythonなどの変数の存在を確認したいと思います。この目的のために、私はos標準ライブラリを使用しています。ライブラリのドキュメントを読んだ後、目標を達成するための2つの方法を見つけました。

方法1:

if "FOO" in os.environ:
    pass

方法2:

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

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


それは主に意見に基づいています。どちらも同じ目的を果たします。それはクリーナーがあるように私は方法1を好むだろう
Moinuddin四

1
なんとも言えません。1つを選び(コインを投げますか?)、機能しないことが判明した場合は後で再評価します。率直に言って、この質問の入力に、どちらの方法で保存するよりも多くの時間を費やしたと思います!
jonrsharpe 2016年

1
@Ayoub:環境変数が Pythonに存在するかどうかを確認するための良い方法は何ですか?」という
Moinuddin Quadri 2016

1
意見に基づく。方法1の構文は、値の結果をfoo探す場合ではなく、環境変数にあるかどうかを尋ねるので、より効果的です。fooNone
Uriel

1
しかし、オランダ人でない限り、その方法は明白ではないかもしれません...
jonrsharpe

回答:


168

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

あなたは何かが存在しているかどうかを確認しようとしている environ、あなたはなぜ、取得ちょうどそれを比較するために、その後、それを離れて投げますか

それがまさに何をするかgetenvです:

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

(これはまた、あなたのチェックがちょうどである可能性があることを意味しますif getenv("FOO")

あなたはそれ取得したくない、あなたはそれが存在するかどうかをチェックしたい。

どちらの方法でも、getenvは単なるラッパーenviron.getですが、マッピングでメンバーシップをチェックしている人は見えません。

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

要約すると、以下を使用します。

if "FOO" in os.environ:
    pass

存在を確認するだけのgetenv("FOO")場合は、取得した値で実際に何かを実行したい場合に使用します。


2
ご説明ありがとうございます。これを覚えておきます。
Kshitij Saraogi 2016年

29

環境変数の存在を条件として何を実行したいかに応じて、どちらのソリューションにもケースがあります。

事例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)

15

安全に使用するために

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'))"

getenvのシグネチャは、def getenv(key, default=None):そうであれば、開始時にデフォルトのvsまたはor構文を許可する必要があります
Chris McKee

@Chris McKeeが試してみました>>> import os; os.environ['FOO'] = ''; print(os.getenv('FOO', 'bar'))
Levon

メソッドのシグネチャ😜誤解を招く
クリス・マッキー

1
@クリス・マッキー、別の例$ FOO= python -c "import os; print(os.getenv('FOO', 'bar'))"
レボン

3

複数の環境変数が設定されていないかどうかを確認する場合は、次の操作を実行できます。

import os

MANDATORY_ENV_VARS = ["FOO", "BAR"]

for var in MANDATORY_ENV_VARS:
    if var not in os.environ:
        raise EnvironmentError("Failed because {} is not set.".format(var))

-1

私のコメントは与えられたタグとは関係がないかもしれません。しかし、私は私の検索からこのページに導かれました。私はRで同様のチェックを探していて、@ hugovdbegの投稿の助けを借りて次のことを思いつきました。Rで同様のソリューションを探している人に役立つと思います

'USERNAME' %in% names(Sys.getenv())
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.