[python] 환경 변수가 있는지 확인하는 좋은 방법은 무엇입니까?

"FOO"파이썬에서 변수가 있는지 환경을 확인하고 싶습니다 . 이를 위해 os표준 라이브러리를 사용하고 있습니다. 도서관 문서를 읽은 후 목표를 달성하는 두 가지 방법을 알아 냈습니다.

방법 1 :

if "FOO" in os.environ:
    pass

방법 2 :

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

어느 방법이 좋은 / 바람직한 조건인지, 왜 그런지 알고 싶습니다.



답변

첫 번째를 사용하십시오. 에 무언가 정의되어 있는지 직접 확인하려고 시도합니다 environ. 두 번째 형식은 똑같이 잘 작동하지만 의미가 없으면 값이 다시 있고 비교를 위해서만 사용하기 때문에 의미가 부족합니다 .

당신은 무언가가 존재하는지 확인하기 위해 노력하고 있는 environ 이유는 것, 를 비교하는 단지 다음 그것을 멀리 던져 ?

그것이 정확히 무엇입니까 getenv:

환경 변수 를 가져오고 None존재하지 않는 경우 반환 하십시오. 선택적 두 번째 인수는 대체 기본값을 지정할 수 있습니다.

(이것은 또한 수표가 그냥 될 수 있음을 의미합니다 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")당신이 실제로 당신이 얻을 수있는 값으로 뭔가를하려는 경우.


답변

환경 변수의 존재에 조건부로 수행하려는 작업에 따라 두 솔루션 중 하나의 경우가 있습니다.

사례 1

값을 고려하지 않고 환경 변수의 존재에 따라 순수하게 다른 조치를 취하려면 첫 번째 솔루션이 가장 좋습니다. 환경 변수 목록에서 ‘FOO’는 다음과 같이 테스트 대상을 간결하게 설명합니다.

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

사례 2

환경 변수에 값이 정의되어 있지 않은 경우 기본값을 설정하려면 두 번째 솔루션은 실제로 작성한 형식이 아니지만 유용합니다.

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

또는 아마도

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

응용 프로그램에 여러 옵션이있는 경우 ChainMap키를 기반으로 여러 dicts를 병합 할 수있는 을 살펴보십시오 . ChainMap설명서 에 이에 대한 예가 있습니다.

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


답변

안전한 측면 사용

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


답변

여러 env 변수가 설정되어 있지 않은지 확인하려면 다음을 수행하십시오.

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


답변

내 의견은 제공된 태그와 관련이 없을 수 있습니다. 그러나 검색에서이 페이지로 연결되었습니다. 나는 R에서 비슷한 검사를 찾고 있었고 @hugovdbeg post의 도움으로 다음을 생각해 냈습니다. R에서 비슷한 솔루션을 찾고있는 사람에게 도움이되기를 바랍니다.

'USERNAME' %in% names(Sys.getenv())


답변