2011-02-09 3 views
2

내부 파이썬 코드에서 stdin에서 매개 변수를 가져 오는 이진 프로그램을 실행하려고합니다. 하위 프로세스 모듈을 사용하면 다음과 같이 간단해야합니다.subprocess.Popen 및 버퍼 처리 된 프로세스 출력

import subprocess 
command = [ 'my_program' ] 
p = subprocess.Popen(command, \ 
     stdin = subprocess.PIPE, stdout = subprocess.PIPE, \ 
     env={ "GFORTRAN_UNBUFFERED_ALL": "1"}) 
p.stdin.write (stdin_stuff) 
while True: 
    o = p.stdout.readline() 
    if p.poll() != None: 
    break 
    # Do something with stdout 

이제 프로그램을 시작하지만 파이썬 스크립트가 그냥 멈 춥니 다. 이것은 gfortran (my_program을 컴파일하여 stdout 스트림을 버퍼링하는 데 사용됩니다 .gfortran은 GFORTRAN_UNBUFFERED_ALL 환경 변수를 사용할 수 있도록 허용 함), 포트란 코드에서 FLUSH() 내장 함수를 사용할 수 있음을 이해합니다. 하지만 여전히 운 : 파이썬 코드는 여전히 응답하지

+0

옆에있는 표시를 "확인"하여 원하는 대답을 수락 할 수 있습니다. 이 사이트에서 정중 한 것으로 간주되므로 요청한 질문에 대해 가장 좋아하는 답변을 확인하십시오. –

답변

4

당신은 수동으로 쓰기보다는 프로세스의 stdin에 문자열을 보낼 Popen.communicate()를 사용하여 더 나은 운이 있어야

stdoutdata, stderrdata = p.communicate(stdin_stuff) 
2

여기, Aphex's answer을 보완하기 위해.. documentation의 관련 부분 :

때문에 다른 OS 파이프 버퍼를 채우고과 자식 프로세스를 차단의에 교착 상태를 방지하기 위해

사용 communicate()보다는 .stdin.write, .stdout.read 또는 .stderr.read 경고

.

+0

이것은 @Aphex 또는 주석에 대한 업데이트로 더 적합 할 수 있습니다. 이것 자체로 좋은 대답처럼 보이지 않습니다. –

+0

@ S.Lott : 댓글을 달아 주겠다고 생각했으나 형식이 실제로 댓글로 작동하지 않습니다. 그래서 Aphex의 대답을 보완하는 것이라고 명시 적으로 언급했습니다. –

+0

"서식이 실제로 주석으로 작동하지 않습니다." 참된. 왜 업데이트를하지 않습니까? –