수정된 환경에서 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
'itsource' 카테고리의 다른 글
페이지 새로 고침 없이 폼 데이터를 PHP로 전달하는 AJAX와 함께 폼 제출 (0) | 2022.12.24 |
---|---|
ASSERTION을 생성하려고 할 때 설명할 수 없는 mysql 오류가 발생했습니다. (0) | 2022.12.24 |
Java에서 파일을 다른 위치로 이동하려면 어떻게 해야 합니까? (0) | 2022.12.24 |
2개의 인덱스의 "OR"을 더 빠른 솔루션으로 대체(UNION)? (0) | 2022.12.24 |
Log4J2 2.11.0 -> Log4J2 2.17.1 업그레이드 - Percona 5.7로의 mariaDB JDBC 드라이버에 대해 appender가 파손됨 - 잘못된 형식의 패킷 - maven - 해결됨 (0) | 2022.12.24 |