2013-02-10 1 views
1

프로세스가 시작되고 프로세스가 실행되는 동안 해당 프로세스의 출력을 읽어야합니다. 출력 (선택 사항)을 인쇄하고 프로세스가 끝나면 출력을 반환 할 수 있기를 원합니다.프로세스가 실행되는 동안 프로세스의 출력을 읽습니다.

def call(command, print_output): 
    process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 
    out = "" 

    while True: 
     line = process.stdout.readline().rstrip().decode("utf-8") 
     if line == '': 
      break 

     if print_output: 
      print(line) 

     out += line + "\n" 

    process.wait() 

    return process.returncode, out 

이 코드는 (윈도우 7, 파이썬 3.3에서 테스트) 창에서 잘 작동하지만 리눅스에서 (우분투 12.04, 파이썬 3.2) 실패 : 여기에 지금까지 가지고 (유래에 다른 답변에서 합병) 것입니다. 리눅스에서 스크립트는 프로세스가 완료되면

line = process.stdout.readline().rstrip().decode("utf-8") 

행에 멈 춥니 다.

코드에 무슨 문제가 있습니까? 프로세스가 process.poll()으로 끝났는지 확인하려고했지만 Linux에서는 None을 항상 반환합니다.

+0

제 리눅스에서 3.2로 잘 돌아가며 닫히지 않은 fd를 닫지 않으면 믿어지지 않을 정도로 버그가있는 것 같습니다. 파이썬 프로그램을'strace' 할 때 무엇을 볼 수 있습니까? 또한 사용중인'command'의 값을 포함 할 수 있습니까? – phihag

+1

귀하의 의견을 보내 주셔서 감사합니다! 문제는 실제로 명령입니다, 그것은 "svn export ..."이고 svn 프로세스는 처음으로 사용자 입력 (login, passwort)을 기대합니다. 그 죄송합니다... – osiris81

답변

0

워드 프로세서 내가 Windows에서 이전에 문제가 있었 알고

Warning Use communicate() rather than 
.stdin.write, .stdout.read or .stderr.read to 
avoid deadlocks due to any of the other OS pipe buffers filling 
up and blocking the child process. 

을 말한다.

어떻게 든 명령이 버퍼링되지 않은 모드로 실행되고 있다고 가정합니다.

도큐멘트에는 shell-backquote과 같은 소리가 서브 프로세스를 사용하기위한 방법이 있지만 subprocess의 사용은 다릅니다.