2010-06-26 16 views
5

mam ten kod:pyton podproces ukryj stdout i czekać go do zakończenia

def method_a(self): 
    command_line = 'somtoolbox GrowingSOM ' + som_prop_path 
    subprocess.Popen(shlex.split(command_line)) 
    ...... 

def method_b(self): ..... 
.... 

i jak widzicie, method_a ma podproces że dzwoni program somtoolbox. Ale ten program ma długą historię i chcę go ukryć. Próbowałem:

subprocess.Popen(shlex.split(command_line), stdout=subprocess.PIPE) 

Ale wrócił to zdanie:

cat: record error: Broked Pipe 

(jest to tłumaczenie zdania Portugalskiej: "cat: erro de gravação: Rury quebrado") (jestem z brazylia)

Mam również inne metody (takie jak method_b tam), które są wywoływane po method_a, a metody tis działają przed podprocesem dokończenia procesu.

Jak mogę ukryć w ogóle stdout (i nie chcę go nigdzie) i sprawić, by drugi kod czekał na zakończenie podprocesu podprocesu?

Obs: somtoolbox to program java, który daje długie wyjście do terminala. Próbowano:

outputTuple = subprocess.Popen(shlex.split(command_line), stdout = subprocess.PIPE).communicate() 

ale ciągłe powracanie do wyjścia. Pomoc!

Odpowiedz

18

Najlepszym sposobem na to jest przekierowanie wyjścia do/dev/null. Można to zrobić tak:

devnull = open('/dev/null', 'w') 
subprocess.Popen(shlex.split(command_line), stdout=devnull) 

Potem czekać, aż to się robi, można użyć .wait() na obiekcie POPEN, zaczyna cię do tego:

devnull = open('/dev/null', 'w') 
process = subprocess.Popen(shlex.split(command_line), stdout=devnull) 
retcode = process.wait() 

retcode będzie zawierało kod powrotu procesu.

DODATKOWE: Jak wspomniano w komentarzach, to nie ukryje stderr. Aby ukryć stderra, zrobiłbyś tak:

devnull = open('/dev/null', 'w') 
process = subprocess.Popen(shlex.split(command_line), stdout=devnull, stderr=devnull) 
retcode = process.wait() 
+0

To nie ukrywa się –

+0

@Gabriel Być może potrzebujesz również przekierować stderr? –

+0

Pracowałem! Dziękuję bardzo! –

5

Popen.communicate służy do oczekiwania na zakończenie procesu. Na przykład:

from subprocess import PIPE, Popen 
outputTuple = Popen(["gcc", "--version"], stdout = PIPE).communicate() 

zwróci krotkę strun, jedną dla stdout i drugą dla wyjścia stderr.

+0

To nie zadziałało. Zobacz moje ostatnie zdanie, aby sprawdzić, czy coś zmieni. Jest to wynik programu java ... proszę zobaczyć. –

+2

Po prostu dodaj ', stderr = PIPE'. – AndiDog