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


130

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

방법 1 :

if "FOO" in os.environ:
    pass

방법 2 :

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

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


주로 의견 기반입니다. 둘 다 같은 목적으로 사용됩니다. 더 깨끗한 방법 1을 선호합니다
Moinuddin Quadri

1
나는 거기에 아무것도 없다고 말할 수 없습니다. 하나를 고르고 (코인을 뒤집어?) 작동하지 않는 것으로 판명되면 나중에 재평가하십시오. 솔직히 말해서 어느 쪽이든 절약하는 것 보다이 질문을 입력하는 데 더 많은 시간을 소비했다고 생각합니다!
jonrsharpe 21시 03 분

1
@Ayoub : " Python에 환경 변수가 있는지 확인하는 좋은 방법은 무엇입니까?"라는
Moinuddin Quadri

1
의견 기반. 방법 1 구문은 더 나은 결과를 foo찾는 것이 아니라 env vars에 있는지 묻기 때문에 더 좋습니다 . fooNone
우리엘

1
그러나 네덜란드 인이 아니라면 그 방법은 분명하지 않을 수 있습니다.
jonrsharpe

답변:


168

첫 번째를 사용하십시오. 에 무언가 정의되어 있는지 직접 확인하려고 시도합니다 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")당신이 실제로 당신이 얻을 수있는 값으로 뭔가를하려는 경우.


2
설명해 주셔서 감사합니다. 나는 이것을 명심할 것이다.
Kshitij Saraogi

29

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

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

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 또는 구문을 허용해야합니다.
Chris McKee

@Chris McKee이 시도>>> import os; os.environ['FOO'] = ''; print(os.getenv('FOO', 'bar'))
Levon

오해의 여지가있는 시그니처 서명 😜
Chris McKee

1
@Chris McKee, 또 다른 예$ FOO= python -c "import os; print(os.getenv('FOO', 'bar'))"
Levon

3

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

-1

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

'USERNAME' %in% names(Sys.getenv())
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.