파이썬 스크립트에서 일부 환경 변수를 설정해야하며 파이썬에서 호출 된 다른 모든 스크립트가 환경 변수 세트를 보길 원합니다.
만약 내가한다면
os.environ["DEBUSSY"] = 1`
그것은 1
문자열이어야 한다고 불평 합니다.
또한 일단 환경 변수를 설정하면 파이썬 (스크립트의 뒷부분)에서 환경 변수를 읽는 방법을 알고 싶습니다.
파이썬 스크립트에서 일부 환경 변수를 설정해야하며 파이썬에서 호출 된 다른 모든 스크립트가 환경 변수 세트를 보길 원합니다.
만약 내가한다면
os.environ["DEBUSSY"] = 1`
그것은 1
문자열이어야 한다고 불평 합니다.
또한 일단 환경 변수를 설정하면 파이썬 (스크립트의 뒷부분)에서 환경 변수를 읽는 방법을 알고 싶습니다.
답변:
환경 변수는 문자열이어야하므로
os.environ["DEBUSSY"] = "1"
변수 DEBUSSY
를 문자열 로 설정합니다 1
.
나중에이 변수에 액세스하려면 다음을 사용하십시오.
print(os.environ["DEBUSSY"])
자식 프로세스는 부모 프로세스의 환경 변수를 자동으로 상속하므로 사용자의 특별한 조치가 필요하지 않습니다.
putenv()
@Evan을 지원하지 않는 유닉스의 역사적 변형이있을 수 있지만 유닉스 에 대해서는 어쨌든 할 수있는 일이 없습니다. 이전 버전의 AIX 및 HPUX에서도 지원했습니다. 오늘날 누군가가 그것을 지원하지 않는 컴퓨터를 실제로 찾을 수 있다면, 그 컴퓨터에서 파이썬을 실행할 수 있을지 의심됩니다. :)
코드 견고성을 위해 몇 가지 추가 측면을 고려해야 할 수도 있습니다.
정수 값 변수를 환경 변수로 저장할 때 시도하십시오
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)
myvar = int(os.environ.get('MYVAR')) if os.environ.get('MYVAR', '') != '' else None
– 숫자가 없다면 None이 될 것입니다
value_not_set = '-1'
. 그러면 다음을 사용할 수 있습니다debussy = int(os.environ.get('DEBUSSY', value_not_set))
os.environ
파이썬 사전처럼 동작하므로 모든 일반적인 사전 작업을 수행 할 수 있습니다. 다른 답변에서 언급 한 get
및 set
작업 외에도 키가 있는지 간단히 확인할 수 있습니다. 키와 값은 문자열 로 저장해야합니다 .
파이썬 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'>
os.environ.data
Python 3.2에서 이름 os.environ._data
이 밑줄 접두어 로 바뀌어 직접 읽지 않아야 함을 나타냅니다. 어쨌든 os.environ._data
업데이트 된 값은 없습니다.
변수를 설정하려면 :
키를 사용한 항목 지정 방법 :
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
환경 변수에 문자열 값을 지정해야합니다.
os.environ["DEBUSSY"] = "1"
환경 변수를 읽거나 인쇄하려면 다음을 사용하십시오.
print os.environ["DEBUSSY"]
이 변경 사항은 지정된 현재 프로세스에만 적용되며 값을 영구적으로 변경하지는 않습니다. 자식 프로세스는 부모 프로세스의 환경을 자동으로 상속합니다.
set [<name>=[<value>]]
했지만 현재 실행중인 프로세스에만 적용됩니다. cmd를 닫으면 존재하지 않으며 열려있는 경우에도 다른 프로그램에서 볼 수 없습니다.
환경 변수를 추가하려고했습니다. 내 목표는 일부 사용자 정보를 시스템 변수에 저장하여 구성 파일의 대안으로 향후 솔루션에 해당 변수를 사용할 수 있도록하는 것입니다. 그러나 아래 코드에 설명 된 방법은 전혀 도움이되지 않았습니다.
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))
이것이 여러분에게 도움이 되길 바랍니다.
환경 변수를 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}")
당신이 사용할 수있는 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
환경 변수 (변수 추가 / 수정 / 제거)로 재생하는 경우 기능 완료시 이전 상태를 복원하는 것이 좋습니다.
환경 변수를 복원하려면 modified_environ
이 질문 에 설명 된 컨텍스트 관리자 와 같은 것이 필요할 수 있습니다 .
고전적인 사용법 :
with modified_environ(DEBUSSY="1"):
call_my_function()