약간 수정 된 환경에서 외부 명령을 실행하는 것이 매우 일반적인 경우라고 생각합니다. 그게 내가하는 경향이 있습니다.
import subprocess, os
my_env = os.environ
my_env["PATH"] = "/usr/sbin:/sbin:" + my_env["PATH"]
subprocess.Popen(my_command, env=my_env)
더 좋은 방법이 있다고 생각합니다. 괜찮아 보이나요?
/usr/sbin:-)
약간 수정 된 환경에서 외부 명령을 실행하는 것이 매우 일반적인 경우라고 생각합니다. 그게 내가하는 경향이 있습니다.
import subprocess, os
my_env = os.environ
my_env["PATH"] = "/usr/sbin:/sbin:" + my_env["PATH"]
subprocess.Popen(my_command, env=my_env)
더 좋은 방법이 있다고 생각합니다. 괜찮아 보이나요?
/usr/sbin:-)
답변:
내가 생각하는 os.environ.copy()현재 프로세스에 대한 os.environ을 수정하지 않을 경우 더 나은 :
import subprocess, os
my_env = os.environ.copy()
my_env["PATH"] = "/usr/sbin:/sbin:" + my_env["PATH"]
subprocess.Popen(my_command, env=my_env)
os.environ.copy를 env변수에 할당하고 있지만 메서드 호출 결과를에 할당해야 os.environ.copy()합니다 env.
shell=True에서 사용하는 경우에만 작동합니다 subprocess.Popen. 이를 수행 할 경우 잠재적으로 보안 관련 사항이 있습니다.
my_command실행 명령입니다. 예를 들어 /path/to/your/own/program또는 다른 "실행 가능"명령문 일 수 있습니다 .
그것은 문제가 무엇인지에 달려 있습니다. 환경을 복제하고 수정하는 경우 한 가지 해결책은 다음과 같습니다.
subprocess.Popen(my_command, env=dict(os.environ, PATH="path"))
그러나 대체 된 변수는 유효한 파이썬 식별자이며, 가장 자주 사용되는 변수입니다 (영숫자 + 밑줄이 아닌 환경 변수 이름 또는 숫자로 시작하는 변수는 얼마나 자주 발생합니까?).
그렇지 않으면 다음과 같이 작성할 수 있습니다.
subprocess.Popen(my_command, env=dict(os.environ,
**{"Not valid python name":"value"}))
매우 이상한 경우 (환경 변수 이름에 제어 코드 또는 ASCII가 아닌 문자를 얼마나 자주 사용합니까?) 환경의 키는 bytes(python3에서) 해당 구문을 사용할 수도 없습니다.
여기에 사용 된 기술 (특히 첫 번째)이 환경의 키에 대한 이점은 일반적으로 유효한 파이썬 식별자이며 사전에 (코딩시) 알려져 있지만 두 번째 접근법에는 문제가 있습니다. 그렇지 않은 경우 다른 방법을 찾아야합니다 .
dict(mapping, **kwargs). 나는 그것이 또는라고 생각했다. 참고 : @Daniel Burke가 현재 허용되는 답변에서 제안한os.environ 대로 수정하지 않고 복사 하지만 답변은 더 간결합니다. Python 3.5 이상에서는 할 수도 있습니다 . pep 448 참조 . dict(**{'x': 1}, y=2, **{'z': 3})
Python 3.5를 사용하면 다음과 같이 할 수 있습니다.
import os
import subprocess
my_env = {**os.environ, 'PATH': '/usr/sbin:/sbin:' + os.environ['PATH']}
subprocess.Popen(my_command, env=my_env)
여기서 우리는 가치 의 사본 os.environ과 재정의로 끝납니다 PATH.
PEP 448 (추가 포장 풀기 일반화) 로 가능했습니다 .
다른 예시. 기본 환경 (예 os.environ:)이 있고 기본값을 재정의하려는 dict 가있는 경우 다음 과 같이 표현할 수 있습니다.
my_env = {**os.environ, **dict_with_env_variables}
env 매개 변수는 사전을 승인합니다. os.environ을 가져 와서 (필요한 경우 dict 사본에 원하는 변수) 키를 추가하고에 매개 변수로 사용할 수 Popen있습니다.
os.environ['SOMEVAR'] = 'SOMEVAL'
os.pathsep플랫폼에서 작동하는 경로에는 ":"대신 사용하는 것이 좋습니다. 참조 stackoverflow.com/questions/1499019/...