2011-03-02 15 views
10

Próbuję uruchomić program (HandBreakCLI) jako podproces lub wątek z poziomu Pythona 2.7. Doszedłem aż do uruchomienia, ale nie mogę się dowiedzieć, jak monitorować to stderr i stdout.Monitorowanie zapytania stderr i stdout podprocesu

Program wyświetla swój status (% done) i informacje o kodowaniu odpowiednio na stderr i stdout. Chciałbym być w stanie okresowo pobrać% wykonane z odpowiedniego strumienia.

Próbowałem wywoływania podprocesu.Popen z stderr i stdout ustawionym na PIPE i używając podprocesu.communicate, ale siedzi i czeka, aż proces zostanie zabity lub zakończony, następnie pobiera dane wyjściowe. Nie robi mi wiele dobrego.

Mam go uruchomione jako wątek, ale o ile mogę powiedzieć, nadal muszę w końcu wywołać podproces.Popen, aby uruchomić program i uruchomić w tej samej ścianie.

Czy podążam tą właściwą drogą? Jakie mam inne opcje lub jak mogę je uruchomić zgodnie z opisem?

+0

'communic()' zawsze czeka na zakończenie procesu; będziesz musiał przeczytać bezpośrednio ze stderr. Czy możesz napisać jakiś kod? – senderle

Odpowiedz

13

Osiągnąłem to samo z ffmpeg. Jest to obnażona wersja odpowiednich fragmentów. bufsize=1 oznacza buforowanie linii i może nie być potrzebny.

def Run(command): 
    proc = subprocess.Popen(command, bufsize=1, 
     stdout=subprocess.PIPE, stderr=subprocess.STDOUT, 
     universal_newlines=True) 
    return proc 

def Trace(proc): 
    while proc.poll() is None: 
     line = proc.stdout.readline() 
     if line: 
      # Process output here 
      print 'Read line', line 

proc = Run([ handbrakePath ] + allOptions) 
Trace(proc) 

Edit 1: zauważyłem, że podproces (hamulec ręczny w tym przypadku) wymaga spłukiwania po linie używać tego (ffmpeg robi).

Edytuj 2: Niektóre szybkie testy ujawniają, że bufsize=1 może nie być rzeczywiście potrzebny.

+0

Obniżanie 'bufsize' nie powinno być potrzebne, chyba że OP nie używa wartości domyślnej, chociaż ustawienie do buforowania linii jest prawdopodobnie dobrym pomysłem:" Domyślna wartość dla bufsize to 0 (niebuforowana). " http://docs.python.org/library/subprocess.html – user470379

+0

Masz rację, właśnie pamiętam ustawienie bufsize na 1 miało jakiś sens i skutek :) Edycja odpowiednio. –

+0

+1 dla edycji 1: "podproces musi przepłukać linie". – db42

Powiązane problemy