2009-09-18 6 views
16

stdout 및 stderr에 쓸 프로그램이 있습니다. python에서 stdout 및 stderr를 캡처하여 실행하고 싶습니다. 프로그램의 몇 가지를 들어stdout = PIPE 인 경우 subprocess.Popen wait()가 영원히 기다리는 이유를 어떻게 알 수 있습니까?

from subprocess import * 

p = Popen(exe, shell=TRUE, stdout=PIPE, stderr=PIPE) 
rtrncode = p.wait() 

이 잘 작동하지만, 나는 새로운 하나를 추가 할 때, 새 영원히 중단 : 내 코드는 것 같습니다. stdout=PIPE을 제거하면 프로그램이 출력을 콘솔에 쓰고 완료되며 모든 것이 정상입니다. 중단의 원인을 어떻게 판별 할 수 있습니까?

Windows XP에서 python 2.5를 사용합니다. 이 프로그램은 stdin을 읽지 않으며 어떠한 종류의 사용자 입력 (예 : "hit a key")을 가지고 있지 않습니다.

답변

35

파이프의 버퍼가 가득 차면 (일반적으로 4KB 정도) 읽기 프로세스가 문제의 데이터 일부를 읽을 때까지 쓰기 프로세스가 중지됩니다. 하지만 여기에서는 하위 프로세스가 완료 될 때까지 아무 것도 읽지 않으므로 교착 상태가됩니다. waitThe docs은 매우 명확 실제로 넣어 :

가 자식 프로세스가 표준 출력 또는 표준 오류 파이프에 허용하도록 OS 파이프에 대한 버퍼를 기다리는 등 그 그 블록을 충분히 출력 을 생성하는 경우이 교착 것 경고 더 많은 데이터. 이를 피하려면 communicate()를 사용하십시오.

어떤 이유로 communicate을 사용할 수없는 경우

는, 임시 파일에 서브 프로세스 쓰기를 한 다음 wait 수 있고 준비가되면 해당 파일을 읽을 - 파일에 쓰는 대신 파이프의 교착 상태에 빠지지는 않습니다.

+0

당신은 나를 조금이라도 이길 수 있습니다. +1 – MitMaro

+0

파이썬 2.5와 함께 설치된 도움말 파일에는 작은 정보가 없습니다. 감사합니다. –

+1

@Graeme, 예, 2.6의 문서는 2.5 점으로 크게 개선되었습니다. –

1

docs을 살펴보십시오. 그것은 당신이 죽은 자물쇠를 일으키는 원인이 될 수 있기 때문에 당신이 기다림을 사용하면 안된 ㄴ다는 것을 주장한다. communicate을 사용해보세요.

관련 문제