2010-06-26 15 views
5

tengo este código:pitón subproceso ocultar la salida estándar y esperar a completar

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

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

y me gusta que todo ve, method_a tiene un subproceso que se llama el programa somtoolbox. Pero este programa tiene una larga duración, y quiero ocultarlo. Probé:

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

pero regresó esta frase:

cat: record error: Broked Pipe 

(esto es una traducción de la frase portugués: "cat: erro de gravação: Pipe quebrado") (soy de brasil)

Además, tengo otros métodos (como method_b allí), que se llaman después del método_a, y estos métodos se ejecutan antes de que el subproceso complete el proceso.

¿Cómo puedo ocultar el stdout en absoluto (y no lo quiero en cualquier lugar), y hacer que el otro código espere a que el subproceso termine la ejecución?

Obs: El somtoolbox es un programa java que proporciona la salida larga al terminal. intentado:

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

pero continua de regresar de salida a la cáscara. Ayuda!

Respuesta

18

La mejor manera de hacerlo es redirigir la salida a/dev/null. Puede hacerlo de esta manera:

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

Luego que esperar hasta que se hace, puede utilizar .wait() en el objeto Popen, que llegar a esto:

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

retcode contendrá entonces la código de retorno del proceso.

ADICIONAL: Como se menciona en los comentarios, esto no ocultará stderr. Para ocultar stderr también lo harías así:

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

No se esconde –

+0

@Gabriel ¿Tal vez necesita redirigir stderr también? –

+0

¡Funcionó! Muchas gracias! –

5

Popen.communicate se utiliza para esperar a que finalice el proceso. Por ejemplo:

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

devolverá una tupla de cadenas, una para la salida estándar y otro para la salida stderr.

+0

No funcionó. Ver mi última frase, para ver si cambia algo. Es una salida de un programa de Java ... ver allí, por favor. –

+2

Solo agrega ', stderr = PIPE'. – AndiDog

Cuestiones relacionadas