2016-06-28 6 views
1

파이썬 2.7에서 다음 파이썬 코드를 실행하면 빈 출력 파일을 얻을 수 있습니다. 뭐가 잘못 되었 니?파이썬 하위 프로세스가 stdout에 쓰지 않습니다.

import subprocess 

with open('outfile.out', 'w') as out: 
    pp=subprocess.Popen(['/bin/cat'],stdin=subprocess.PIPE,stdout=out) 
    pp.stdin.write('Line I want into out file\n') 
    pp.terminate() 

답변

2
terminate D 프로세스

, 결코 플러시/그것으로 입력 닫혀 있으므로 모든 데이터가 버퍼에 부착하고, 처리가 강제로 사망 할 때 버렸다. 프로세스가 완료 될 때까지 당신은 입력을 전달 stdin을 종료 한 후 대기 결합 communicate를 사용할 수 있습니다

import subprocess 

with open('outfile.out', 'w') as out: 
    pp=subprocess.Popen(['/bin/cat'],stdin=subprocess.PIPE,stdout=out) 
    pp.communicate('Line I want into out file\n') 

을이 경우 (단지 세 가지 표준 핸들 중 하나는 파이프가), 당신은 또한 안전이 작업을 수행 할 수 있습니다 :

PIPE으로 하나의 표준 핸들을 사용하는 경우에만 수행해야
import subprocess 

with open('outfile.out', 'w') as out: 
    pp=subprocess.Popen(['/bin/cat'],stdin=subprocess.PIPE,stdout=out) 
    pp.stdin.write('Line I want into out file\n') 
    pp.stdin.close() 
    pp.wait() # Optionally with a timeout, calling terminate if it doesn't join quickly 

; 두 개 이상이 PIPE 인 경우 데드락 (자식이 stdout에 쓰고 버퍼를 지우려면 읽기를 기다리고 버퍼를 지우려면 자식이 기다리는 동안 stdin에 쓰는 중입니다) 이 해결합니다. 스레드 또는 선택 모듈을 사용하면 교착 상태를 피하기 위해 해당 디자인을 모방해야합니다.

+1

'pp.join()'대신'pp.wait()'('multiprocessing'가 아닌'subprocess')를 사용하십시오. ('subprocess32' 모듈을 사용하지 않는 한) Python 2.7에는'timeout' 매개 변수가 없습니다. – jfs

+0

@ J.F.Sebastian :'wait' 대'join' 비트를 수정했습니다; 'timeout'이 사용 가능할 때 주석이 명확해질 수 있습니다. – ShadowRanger

관련 문제