[python] 환경이 수정 된 Python 하위 프로세스 / Popen

약간 수정 된 환경에서 외부 명령을 실행하는 것이 매우 일반적인 경우라고 생각합니다. 그게 내가하는 경향이 있습니다.

import subprocess, os
my_env = os.environ
my_env["PATH"] = "/usr/sbin:/sbin:" + my_env["PATH"]
subprocess.Popen(my_command, env=my_env)

더 좋은 방법이 있다고 생각합니다. 괜찮아 보이나요?



답변

내가 생각하는 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)


답변

그것은 문제가 무엇인지에 달려 있습니다. 환경을 복제하고 수정하는 경우 한 가지 해결책은 다음과 같습니다.

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에서) 해당 구문을 사용할 수도 없습니다.

여기에 사용 된 기술 (특히 첫 번째)이 환경의 키에 대한 이점은 일반적으로 유효한 파이썬 식별자이며 사전에 (코딩시) 알려져 있지만 두 번째 접근법에는 문제가 있습니다. 그렇지 않은 경우 다른 방법을 찾아야합니다 .


답변

원래 환경에서 정의되지 않은 것이 아니라 괜찮아 보이는 경우 my_env.get("PATH", '')대신에 사용할 수 있습니다 .my_env["PATH"]PATH


답변

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}


답변

os.envrion 객체 등을 복사하지 않고 환경 변수를 임시로 설정하려면 다음을 수행하십시오.

process = subprocess.Popen(['env', 'RSYNC_PASSWORD=foobar', 'rsync', \
'rsync://username@foobar.com::'], stdout=subprocess.PIPE)


답변

env 매개 변수는 사전을 승인합니다. os.environ을 가져 와서 (필요한 경우 dict 사본에 원하는 변수) 키를 추가하고에 매개 변수로 사용할 수 Popen있습니다.


답변

나는 이것이 한동안 대답되었다는 것을 알고 있지만, 환경 변수에 PATH 대신 PYTHONPATH를 사용하는 것에 대해 알고 싶은 점이 있습니다. 수정 된 환경을 다른 방식으로 처리하는 cronjobs로 파이썬 스크립트를 실행하는 방법에 대한 개요를 설명했습니다 ( 여기 참조 ). 나와 같은이 답변보다 조금 더 필요한 사람들에게는 도움이 될 것이라고 생각했습니다.