2016-09-27 3 views
2

이상적으로는 단일 서브 프로세스 호출을 사용하여 모든 명령을 실행하고 실행하려는 명령 목록과 같아야합니다. 모든 명령을 쉘 스크립트로 저장하고 subprocess를 사용하여 해당 스크립트를 호출하여 비슷한 작업을 수행 할 수 있었지만 순수한 파이썬 솔루션이 필요합니다. shell = True로 명령을 실행하고 위험을 이해합니다.단일 파이썬 서브 프로세스 호출로 여러 쉘 명령을 실행하려면 어떻게해야합니까?

+0

실행하려는 명령 유형의 일반적인 예를 제공 할 수 있습니까? – idjaw

+0

'&'/';'/'&&'명령을 함께 묶을 수 있습니까? 왜 하나의 서브 프로세스가 호출되는지 - 왜 루프를하지 않으면 일찍 종료하는 등의 제어를 할 수 있습니까? – ryachza

+2

';'를 사용하여'subprocess.call ("do_A; do_B; do_C;", shell = True)'를 순서대로 지정하십시오. 프로그래밍 방식으로 :'call (';'.join (commands), shell = True) ' – Bakuriu

답변

1

독립형 인 경우 세미콜론을 사용하여 연결하십시오. 예를 들어

(파이썬 3)

>>> import subprocess 
>>> result = subprocess.run('echo Hello ; echo World', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 
>>> result 
CompletedProcess(args='echo Hello ; echo World', returncode=0, stdout=b'Hello\nWorld\n') 

그러나 기술적으로 그 때문에 shell=True의 순수한 파이썬 해결책이 아니다. arg 처리는 실제로 쉘에 의해 수행됩니다. (/bin/sh -c "$your_arguments"을 실행하는 것으로 생각할 수도 있습니다.)

좀 더 순수한 솔루션을 원하면 shell=False을 사용해야하며 몇 가지 명령을 반복해야합니다. 지금까지 내가 아는 한, 서브 프로세스 모듈을 사용하여 여러 서브 프로세스를 직접 시작할 수있는 방법은 없습니다.

+1

뭔가가 명령 목록을 반복해야합니다. 셸이이 작업을 수행 할 수 있습니다. 파이썬은 이것을 할 수 있습니다. – Skaperen

+0

@ 스카프렌. 파이썬이 루핑을하고'exec()'시스템 콜을한다면, 나는 OP가 원하는 것처럼 더 순수하다고 생각할 것입니다. –

관련 문제