파이썬에서 환경 변수를 설정하는 방법


658

파이썬 스크립트에서 일부 환경 변수를 설정해야하며 파이썬에서 호출 된 다른 모든 스크립트가 환경 변수 세트를 보길 원합니다.

만약 내가한다면

os.environ["DEBUSSY"] = 1`

그것은 1문자열이어야 한다고 불평 합니다.

또한 일단 환경 변수를 설정하면 파이썬 (스크립트의 뒷부분)에서 환경 변수를 읽는 방법을 알고 싶습니다.




질문과 관련이 없습니다 : 나는 그 var를 읽었습니다. 고양이
아메드

답변:


790

환경 변수는 문자열이어야하므로

os.environ["DEBUSSY"] = "1"

변수 DEBUSSY를 문자열 로 설정합니다 1.

나중에이 변수에 액세스하려면 다음을 사용하십시오.

print(os.environ["DEBUSSY"])

자식 프로세스는 부모 프로세스의 환경 변수를 자동으로 상속하므로 사용자의 특별한 조치가 필요하지 않습니다.


20
일부 플랫폼에서 os.environ을 수정하면 현재 프로세스 또는 하위 프로세스에 대한 시스템 환경이 실제로 수정되지 않습니다. 자세한 내용은 문서를 참조하십시오. docs.python.org/2/library/os.html#os.environ
Evan

8
putenv()@Evan을 지원하지 않는 유닉스의 역사적 변형이있을 수 있지만 유닉스 에 대해서는 어쨌든 할 수있는 일이 없습니다. 이전 버전의 AIX 및 HPUX에서도 지원했습니다. 오늘날 누군가가 그것을 지원하지 않는 컴퓨터를 실제로 찾을 수 있다면, 그 컴퓨터에서 파이썬을 실행할 수 있을지 의심됩니다. :)
Sven Marnach

3
주의 : 위의 @Evan 참조에서 인용 하면 환경에 대한 이러한 변경은 os.system (), popen () 또는 fork () 및 execv ()로 시작하는 하위 프로세스에 영향을 미칩니다. 다시 말해,이 접근 방식은 프로그램 실행 방식을 변경하지 않고 프로그램의 자식 실행 방식 만 수정한다는 점을 명심하십시오. 사실, 프로그램은 환경 변수를 설정하고 읽을 수 있지만 자식에 대해 구성된 환경에서만 읽을 수 있습니다. 참조 : 현재 프로세스 환경 변경 . 지금까지 파이썬 스크립트가 부모 환경을 수정하는 방법을 찾지 못했습니다.
코드 리드

1
@SvenMarnach는 bash와 같은 쉘에 대해 "자식 프로세스가 자동으로 부모 프로세스의 환경을 상속합니다"라는 문장입니다
Krishna Oza

@darth_coder 유닉스 계열 운영 체제의 모든 프로세스에 적용됩니다. 다른 운영 체제에 대해 모르겠습니다. 쉘 변수는 내 보내지 않는 한 환경에 저장되지 않습니다.
Sven Marnach

114

코드 견고성을 위해 몇 가지 추가 측면을 고려해야 할 수도 있습니다.

정수 값 변수를 환경 변수로 저장할 때 시도하십시오

os.environ['DEBUSSY'] = str(myintvariable)

그런 다음 검색하려면 오류를 피하기 위해 시도해야한다고 생각하십시오.

os.environ.get('DEBUSSY', 'Not Set')

'설정되지 않음'대신 '-1'을 대체 할 수 있음

그래서, 그 모든 것을 함께

myintvariable = 1
os.environ['DEBUSSY'] = str(myintvariable)
strauss = int(os.environ.get('STRAUSS', '-1'))
# NB KeyError <=> strauss = os.environ['STRAUSS']
debussy = int(os.environ.get('DEBUSSY', '-1'))

print "%s %u, %s %u" % ('Strauss', strauss, 'Debussy', debussy)

3
리눅스 머신에서 변수를 설정하는 방법을 알 수 있습니까? 코드는 모든 플랫폼에서 동일합니까?
Anurag-Sharma

2
누락 된 정수에 대해 -1을 저장하는 것은 거의 불가능합니다. 더 나은 방법은 myvar = int(os.environ.get('MYVAR')) if os.environ.get('MYVAR', '') != '' else None– 숫자가 없다면 None이 될 것입니다
Benjamin Atkin

1
정수를 다루는 경우 -1이 의미가 있습니다. 설정하지 않은 값 (예 :)에 변수 / 상수를 설정했을 수도 있습니다 value_not_set = '-1'. 그러면 다음을 사용할 수 있습니다debussy = int(os.environ.get('DEBUSSY', value_not_set))
yeOldeDataSmythe

68

os.environ파이썬 사전처럼 동작하므로 모든 일반적인 사전 작업을 수행 할 수 있습니다. 다른 답변에서 언급 한 getset작업 외에도 키가 있는지 간단히 확인할 수 있습니다. 키와 값은 문자열 로 저장해야합니다 .

파이썬 3

파이썬 3의 경우 사전 에서 has_key 대신 in 키워드를 사용하십시오 .

>>> import os
>>> 'HOME' in os.environ  # Check an existing env. variable
True
...

파이썬 2

>>> import os
>>> os.environ.has_key('HOME')  # Check an existing env. variable
True
>>> os.environ.has_key('FOO')   # Check for a non existing variable
False
>>> os.environ['FOO'] = '1'     # Set a new env. variable (String value)
>>> os.environ.has_key('FOO')
True
>>> os.environ.get('FOO')       # Retrieve the value
'1'

사용에 관해주의해야 할 중요한 사항이 있습니다 os.environ.

자식 프로세스는 부모 프로세스에서 환경을 상속 받았지만 최근에 문제가 발생하여 파이썬 스크립트가 실행되는 동안 환경을 업데이트하는 다른 스크립트가있는 경우 os.environ다시 호출 하면 최신 값이 반영되지 않습니다 .

문서 에서 발췌 :

이 매핑은 os 모듈을 처음 가져올 때, 일반적으로 site.py 처리의 일부로 Python 시작 중에 캡처됩니다. 이 시간 이후 변경된 환경은 os.environ을 직접 수정하여 변경 한 경우를 제외하고 os.environ에 반영되지 않습니다.

os.environ.data 모든 환경 변수를 저장하는 dict 객체는 모든 환경 값을 포함합니다.

>>> type(os.environ.data)  # changed to _data since v3.2 (refer comment below)
<type 'dict'>

1
프로세스의 환경 변수는 프로세스가 작성 될 때 설정됩니다. 이 이후에 변경된 내용은 프로세스 자체 환경 변수 사본에 영향을 미치지 않습니다. 이것은 파이썬뿐만 아니라 모든 프로세스에 공통입니다. 또한 os.environ.dataPython 3.2에서 이름 os.environ._data이 밑줄 접두어 로 바뀌어 직접 읽지 않아야 함을 나타냅니다. 어쨌든 os.environ._data업데이트 된 값은 없습니다.
Al Sweigart

네, 이해합니다. 나는 처음 놀람을 다른 사람들과 공유하고 싶었다. 3.2 이후 변수 이름 업데이트를 지적 해 주셔서 감사합니다.
sisanared

21

os.environ [ "DEBUSSY"] = 1을 수행하면 1이 문자열이어야한다고 불평합니다.

그런 다음

os.environ["DEBUSSY"] = "1"

또한 일단 파이썬에서 환경 변수를 읽는 방법을 알고 싶습니다 (스크립트의 뒷부분에서) 일단 설정하면.

os.environ["DEBUSSY"]에서와 같이 사용하십시오 .

some_value = os.environ["DEBUSSY"]

19

변수를 설정하려면 :

키를 사용한 항목 지정 방법 :

import os    
os.environ['DEBUSSY'] = '1'  #Environ Variable must be string not Int

존재 여부를 확인하거나

os.environ 은 인스턴스 이므로 객체 방식을 시도 할 수 있습니다.

방법 1 :

os.environ.get('DEBUSSY') # this is error free method if not will return None by default

'1'반환 값으로 얻을 것이다

방법 2 :

os.environ['DEBUSSY'] # will throw an key error if not found!

방법 3 :

'DEBUSSY' in os.environ  # will return Boolean True/False

방법 4 :

os.environ.has_key('DEBUSSY') #last 2 methods are Boolean Return so can use for conditional statements

16

환경 변수에 문자열 값을 지정해야합니다.

os.environ["DEBUSSY"] = "1"

환경 변수를 읽거나 인쇄하려면 다음을 사용하십시오.

print os.environ["DEBUSSY"]

이 변경 사항은 지정된 현재 프로세스에만 적용되며 값을 영구적으로 변경하지는 않습니다. 자식 프로세스는 부모 프로세스의 환경을 자동으로 상속합니다.

여기에 이미지 설명을 입력하십시오


5
"이 변경 사항은 현재 지정된 프로세스에만 적용되며 값을 영구적으로 변경하지 않습니다."이것은 환경 변수 설정 범위에 대한 질문에 대한 답변입니다.
spitfiredd

2
파이썬 쉘을 종료하면 이전에 설정된 os 환경이 사라집니다.
MeadowMuffins

Windows에서 환경 변수를 어떻게 설정합니까? 시도 set [<name>=[<value>]]했지만 현재 실행중인 프로세스에만 적용됩니다. cmd를 닫으면 존재하지 않으며 열려있는 경우에도 다른 프로그램에서 볼 수 없습니다.
Filip

15

무엇에 대해 os.environ["DEBUSSY"] = '1'? 환경 변수는 항상 문자열입니다.


14

환경 변수를 추가하려고했습니다. 내 목표는 일부 사용자 정보를 시스템 변수에 저장하여 구성 파일의 대안으로 향후 솔루션에 해당 변수를 사용할 수 있도록하는 것입니다. 그러나 아래 코드에 설명 된 방법은 전혀 도움이되지 않았습니다.

import os
os.environ["variable_1"] = "value_1"
os.environ["variable_2"] = "value_2"
# To Verify above code
os.environ.get("variable_1")
os.environ.get("variable_2")

이 간단한 코드 블록은 잘 작동하지만 이러한 변수는 각 프로세스 내에 존재하므로 Windows 시스템 설정의 환경 변수 탭에서 찾을 수 없습니다. 위의 코드는 거의 제 목적을 달성하지 못했습니다. 이 문제는 여기서 논의됩니다 : 변수 저장 문제

os.environ.putenv(key, value)

또 다른 시도는 실패했습니다. 그래서 마지막으로 os 패키지의 시스템 클래스에 래핑 된 Windows 쉘 명령을 모방하여 창 환경 레지스터 내에 변수를 성공적으로 저장했습니다. 다음 코드는이 성공적인 시도를 설명합니다.

os.system("SETX {0} {1} /M".format(key, value))

이것이 여러분에게 도움이 되길 바랍니다.


12

환경 변수를 bash 평가로 설정하려고 하면 예상 한 것을 저장 하지 않습니다 . 예:

from os import environ

environ["JAVA_HOME"] = "$(/usr/libexec/java_home)"

이것은 쉘에서와 같이 평가하지 않으므로 /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home경로 로 얻는 대신 리터럴 표현을 얻을 수 $(/usr/libexec/java_home)있습니다.

다음과 같이 환경 변수를 설정하기 전에이를 평가하십시오.

from os import environ
from subprocess import Popen, PIPE

bash_variable = "$(/usr/libexec/java_home)"
capture = Popen(f"echo {bash_variable}", stdout=PIPE, shell=True)
std_out, std_err = capture.communicate()
return_code = capture.returncode

if return_code == 0:
    evaluated_env = std_out.decode().strip()
    environ["JAVA_HOME"] = evaluated_env
else:
    print(f"Error: Unable to find environment variable {bash_variable}")

11

당신이 사용할 수있는 os.environ환경 변수에 액세스 할 사전.

이제 내가 가진 문제 os.system는 **. bat * 파일의 SET 명령을 사용하여 환경 변수를 설정하는 배치 파일을 실행 하려고하면 실제로 파이썬 환경에 대해 설정하지는 않는다는 것입니다. os.system함수 로 생성 된 자식 프로세스 ). 실제로 파이썬 환경에서 변수를 설정하려면이 스크립트를 사용하십시오.

import re
import system
import os

def setEnvBat(batFilePath, verbose = False):
    SetEnvPattern = re.compile("set (\w+)(?:=)(.*)$", re.MULTILINE)
    SetEnvFile = open(batFilePath, "r")
    SetEnvText = SetEnvFile.read()
    SetEnvMatchList = re.findall(SetEnvPattern, SetEnvText)

    for SetEnvMatch in SetEnvMatchList:
        VarName=SetEnvMatch[0]
        VarValue=SetEnvMatch[1]
        if verbose:
            print "%s=%s"%(VarName,VarValue)
        os.environ[VarName]=VarValue

9

환경 변수 (변수 추가 / 수정 / 제거)로 재생하는 경우 기능 완료시 이전 상태를 복원하는 것이 좋습니다.

환경 변수를 복원하려면 modified_environ질문 에 설명 된 컨텍스트 관리자 와 같은 것이 필요할 수 있습니다 .

고전적인 사용법 :

with modified_environ(DEBUSSY="1"):
    call_my_function()
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.