파이썬에서 많은 bash 명령을 실행해야합니다. 잠시 동안
subprocess.Popen (cmd, shell = True)을 사용하여이 작업을 수행하고 있습니다. 동일한 쉘에서이 명령을 모두 실행하는 솔루션이 있습니까? subprocess.Popen은 매번 실행될 때마다 새 셸을 열고 모든 호출시 필요한 모든 변수를 설정해야 cmd 명령이 제대로 작동합니다.파이썬에서 서브 프로세스를 사용하여 새 하위 프로세스 생성 금지
답변
대신 multiprocessing을 사용하면 더 가볍고 효율적입니다.
subprocess.Popen과 달리 실행될 때마다 새 셸을 열지 않습니다.
은 subprocess.Popen
을 실행할 때이 필요하다고 말하지 않았으므로 필요하지 않을 수도 있습니다. 당신은 방금 그것이 당신이 현재하고있는 것이라고 말했습니다. 더 정당화하십시오.
환경 프로세스에서 환경 변수를 한 번 설정하는 방법은 set env var in Python multiprocessing.Process을 참조하십시오.
'다중 처리 '가 실제로 여기서 도움이 될 수있는 방법을 설명 할 수 있습니까? – dano
subprocess.Popen과 다르기 때문에 매번 실행될 때마다 OP가 새로운 쉘을 열지 않습니다. 정답을 하향 투표하지 않는 것을 고려 했습니까? 그것은 짜증스럽고 파괴적입니다. – smci
나는 downvote하지 않았다. 'subprocess.Popen'은 자식 프로세스를 실행합니다. 'multiprocessing.Process'는 다른 프로세스에서 파이썬 호출 가능 함수를 실행합니다. 어떻게 OP를 원한다면 하나의 쉘에서 여러 개의 bash 명령을 실행하기 위해'다중 처리. 프로세스 (multiprocessing.Process) '를 사용할 수 있을까요? – dano
실행해야하는 모든 명령을 사용하여 셸 스크립트를 작성하지 않고 단일 subprocess.Popen()
호출을 사용하여 실행하십시오. 실행할 명령의 내용이 Python 스크립트에서 계산 된 결과에 따라 다르면 셸 스크립트를 동적으로 만든 다음 실행하면됩니다.
내 명령은 다른 명령에 의해 구분됩니다. 나는 이것이 어떻게 행해질 지 모르지만 복잡한 구문을 초래할 것이라고 생각합니다. –
하나의 쉘을 갖는 것이 여전히 0 쉘보다 나쁩니다. 우리가 왜 zero shell을 가질 수 없는지에 대한 이유는 알지 못한다. 명시 적 argv 배열을 가지고 각 command를 호출하고 (암시 적으로)'shell = False'를 호출한다. –
subprocess.Popen
을 사용하면 실행중인 프로세스의 환경이 될 환경 변수 사전을 제공 할 수 있습니다. shell=True
이 필요한 유일한 이유가 환경 변수를 설정하는 것이라면, 대신 명시 적 환경 사전을 사용하는 것이 좋습니다. 더 안전하고 특히 어렵지 않습니다. 또한, 인용 및 셸 메타 문자에 대해 걱정할 필요가 없을 때 일반적으로 명령 호출을 구성하는 것이 훨씬 쉽습니다.
실행중인 프로세스에서 환경 변수를 설정하지 않아도 환경 사전을 작성하지 않아도됩니다. (대개의 경우 문제가되지 않지만 때로는 알기 쉽습니다.)
설정으로 자신의 환경을 수정할 수 있다면 : 어떤 이유로 당신이 당신의 자신의 환경을 변경할 수없는 경우
이output = subprocess.check_output(["ls", "-lR", "/tmp"])
, 당신의 사본을 만들 필요가 :
os.environ['theEnvVar'] = '/the/value'
은 그럼 그냥 간단한 Popen.call
(또는 유사)를 실행하는 명령을 사용할 수 있습니다 현재 환경을 원하는대로 수정하고 각에 전달합니다.: 당신이 env=env
마다 시간을 지정하고 싶지 않을 경우
env = os.environ.copy()
env['theEnvVar'] = '/the/value'
output = subprocess.check_output(["ls", "-lR", "/tmp"], env=env)
는 조금 래퍼 클래스를 작성합니다.
실행하는 각 명령은 여전히 하위 프로세스이며 스크립트 또는 스크립트에 의해 생성 된 셸의 하위 프로세스입니다. 자녀와 스크립트 사이에 쉘이 필요합니까? – soulseekah
모든 하위 프로세스에서 .Popen 변수를 내보내고 동일한 호출에서 cmd 명령을 실행해야합니다. 이것은 추한 구문을 생성합니다. 이 변수를 한 번만 내보내고 그 후에는 내 cmd 명령을 실행하는 것이 좋습니다. –
'subprocess.Popen()'을 실제로 사용해야하는 경우가 아니라면, 대신에'multiprocessing.Process'를 사용해야합니다. (귀하의 모든 직업은 독립적이며 비공식입니까?작업 순서의 중간에 0이 아닌 오류 상태를 잡는 것에 대해 걱정할 필요가 있습니까?) – smci