2013-01-21 2 views
6

을 걸 좋아하지는파이썬는 popen(). stdout.read() 나는 파이썬의 <code>subprocess.Popen</code>를 사용하여, 다른 스크립트의 출력을 얻으려고

process = Popen(command, stdout=PIPE, shell=True) 
exitcode = process.wait() 
output = process.stdout.read() # hangs here 

그것은 내가 실행하는 경우에만, 세 번째 줄에 중단을 다음과 그것은 파이썬 스크립트와 나는 파이썬 껍질에 이것을 재현 할 수 없습니다.

다른 스크립트는 몇 단어 만 인쇄하고 버퍼 문제가 아닌 것으로 가정합니다.

누구나 내가 여기서 잘못하고있는 것에 대해 생각하고 있습니까?

+0

그리고 명령을'command'에서 수동으로 실행하면 출력이 생성됩니까? –

답변

0

.wait().read()이 아닌 .communicate()을 사용하고 싶을 것입니다. stdout=PIPE 및/또는 stderr=PIPE를 사용하는 경우

교착 것이 경고와 자식 프로세스는 블록이 수용 할 수있는 OS 파이프 버퍼에 대기하도록 파이프에 충분한 출력을 생성하십시오 subprocess 문서 페이지의 경고에 대한 wait() 참고 더 많은 데이터. 이를 피하려면 communicate()을 사용하십시오.

http://docs.python.org/2/library/subprocess.html#subprocess.Popen.wait

+0

답변 해 주셔서 감사합니다. 나는 그 부분을 읽었다는 것을 깨달았다 .. 내가하고있는 것은 스크립트가 실행되는 동안'process.poll() is None : '루프에서 stdout 실시간을 가져 오는 것이고 위의 코드는 버젼 다운. 하지만 비슷한 교착 상태 때문에 매달린 것 같아요. – lyomi

0

읽기() 반환하기 전에 EOF를 기다립니다. 당신은 할 수

: 서브 프로세스

  • 대기 죽을 다음 읽기() 반환합니다.
  • 출력이 줄 바꿈 된 경우 readline()을 사용하십시오 (출력 줄이 없으면 여전히 중단됩니다).
  • F에서 최대 N 바이트를 반환하지만 파이프가 비어 있으면 (O_NONBLOCK이 fd에 설정되어 있지 않으면) 계속 차단하는 os.read (F, N)를 사용하십시오.