2017-05-03 2 views
1

파이썬 스크립트에서 대형 빌드 스크립트 (bash 명령)를 실행해야합니다. 큰 문자열로 수신하고 각 줄은 \ n으로 나뉩니다. 그래서 각 줄을 따로 실행해야합니다.파이썬에서 같은 프로세스에서 bash 명령을 실행하십시오.

먼저, subprocess.Popen()을 사용하여 실행하려고했습니다. 그러나 문제는 다음과 같습니다. 각 줄 다음에 프로세스가 종료되고 모든 환경 변수가 손실됩니다.

문제는 다른 명령을 실행하기 위해 명령을 마칠 때까지 기다리는 것이 아니라 동일한 쉘에서 모든 명령을 실행해야합니다.

내가 지금까지 발견 한 유일한 해결책은 모든 명령을 sh 파일 (예 : build.sh)로 저장하고 파이썬에서 실행하는 것입니다.

각 실행에 대해 더 많은 제어 권한을 갖고 싶기 때문에이 approuch를 사용하고 싶지 않습니다.

동일한 프로세스에서 이러한 명령을 하나씩 실행할 수있는 방법이 있습니까?

다른 해결책도 좋습니다.

+0

의 사용 가능한 복제 [파이썬이 완료 쉘 명령을 기다리는 (http://stackoverflow.com/questions/16196712/python-to-wait-for-shell-command-to-complete) – vv01f

+0

당신을 'subprocess.Popen()'을 사용하여 쉘을 시작한 다음 명령을 표준 입력에 제공 할 수 있습니다. – jasonharper

+0

@jasonharper Popen의 결과를 얻고 다른 Popen에 표준으로 직접 추가 하시겠습니까? 그러나 환경 변수는 어떻습니까? 내가 어떻게 그들을 지킬 수 있니? – leandrocastelli

답변

2

원하는 것은 분명히 조금 이상하지만 파이프 사용이 가능합니다.

from subprocess import PIPE, Popen 

p = Popen(['bash'], stdin=PIPE, stdout=PIPE) 
p.stdin.write('echo hello world\n') 
print(p.stdout.readline()) 
# Check a return code 
p.stdin.write('echo $?\n') 
if p.stdout.readline().strip() ⩵ '0': 
    print("Command succeeded") 
p.stdin.write('echo bye world\n') 
# Close input and wait for bash to exit 
stdout, stderr = p.communicate() 
print(stdout) 
+1

stdout을 플러시하여 작동하는지 확인하고 'bash'가 버퍼링되지 않은 채로 작동하도록하거나, 교착 상태가 될 수 있습니다. 그때조차도 부서지기 쉽습니다. 교착 상태가 발생하지 않도록'select' 모듈이나 쓰레드를 사용하거나 커스터마이징이 가능한 제 3 자'pexpect' 모듈을 사용해야 할 것입니다. – ShadowRanger

0

쉘을 호출 할 때, 쉘 인터프리터가 파이썬에서 끝나지 않으면 os는 새 프로세스를 시작합니다.

동일한 프로세스에서 수행 할 수있는 유일한 방법은 파이썬으로 모든 단계를 직접 시뮬레이션하는 것입니다.

더 좋은 방법은 제한을 수용하고 외부 프로세스를 직접 호출하고 스크립트가 제어를 종료 할 때까지 기다리는 것입니다. 예 : 여기에 : python to wait for shell command to complete