itsource

수정된 환경에서 Python 하위 프로세스/팝업

mycopycode 2022. 12. 24. 17:27
반응형

수정된 환경에서 Python 하위 프로세스/팝업

약간 변경된 환경에서 외부 명령을 실행하는 것은 매우 일반적인 경우라고 생각합니다.그게 내가 하는 방식이야

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.environment를 변경하지 않는 것이 좋습니다.

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"))

그러나 이는 대체된 변수가 유효한 python 식별자인지 여부에 따라 달라집니다(영숫자+밑줄이 아닌 환경 변수 이름 또는 숫자로 시작하는 변수가 자주 발생합니까?).

그렇지 않으면 다음과 같이 쓸 수 있습니다.

subprocess.Popen(my_command, env=dict(os.environ, 
                                      **{"Not valid python name":"value"}))

환경의 키가 다음과 같은 매우 이상한 경우(환경 변수 이름에 제어 코드 또는 ASCII가 아닌 문자를 얼마나 자주 사용합니까?)bytes(python3에서는) 그 구성도 사용할 수 없습니다.

여기서 환경 키에서 사용되는 기술(특히 첫 번째)은 일반적으로 유효한 python 식별자이며 코딩 시 미리 알려져 있는 것처럼 두 번째 접근법에는 문제가 있습니다.그렇지 않은 경우에는 다른 방법을 찾아야 합니다.

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(Additional Unpacking Generalizations)에 의해 실현되었습니다.

또 다른 예.디폴트 환경(즉,os.environ디폴트보다 우선하는 dict는 다음과 같이 표현할 수 있습니다.

my_env = {**os.environ, **dict_with_env_variables}

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

os.envrion 객체 등을 복사하지 않고 일시적으로 환경변수를 설정하려면 다음 절차를 수행합니다.

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

env 파라미터는 사전을 받아들입니다.os.environment를 사용하여 키(필요한 경우 dict 복사본에 원하는 변수)를 추가하여 파라미터로 사용할 수 있습니다.Popen.

이 답변은 꽤 오래되었지만 환경변수에서 PATH 대신 PYTONPATH를 사용하는 것에 대해 알고 싶은 점이 있습니다.수정된 환경을 다른 방식으로 처리하는 cronjobs에서 python 스크립트를 실행하는 방법에 대해 설명했습니다(여기 참조).나처럼 이 대답보다 조금 더 필요한 사람들에게 좋을 것 같아서요

상황에 따라서는 서브프로세스에 필요한 환경변수만 전달하고 싶을 수도 있지만, 일반적으로 올바른 생각을 가지고 계신 것 같습니다(저도 그렇게 하고 있습니다).

언급URL : https://stackoverflow.com/questions/2231227/python-subprocess-popen-with-a-modified-environment

반응형