2011-09-28 10 views
7

Tengo un script simple de Python para ejecutar el paquete de prueba tanto en Windows como en Linux. Cada prueba escribe su salida en un archivo separado. Yo uso subproceso.Popen clase para ejecutar el comando de shell en un ciclo.Subproceso de Python. Salida de salida y asíncrona

todos los comandos de shell se inicia así:

def system_execute(self, command, path, out_file): 
    params_list = command.split(' ') 
    file_path = os.path.join(path, out_file) 
    f = open(file_path, "w") 
    subprocess.Popen(params_list, stdout=f) 
    f.close() 

Funciona bien, pero la escritura termine su trabajo antes de todos los archivos de salida se han escrito. En realidad, obtengo cientos de archivos de tamaño cero, y lleva tiempo dejar de escribir los resultados y cerrar identificadores. ¿Alguien podría explicar el motivo por el que funciona tan extraño y existe una forma sincrónica de hacer el mismo trabajo?

Gracias

Respuesta

15

Antes f.close(), que tienen que wait() para nuestra subproceso.

def system_execute(self, command, path, out_file): 
    params_list = command.split(' ') 
    file_path = os.path.join(path, out_file) 
    f = open(file_path, "w") 
    sp = subprocess.Popen(params_list, stdout=f) 
    sp.wait() 
    f.close() 

o simplemente

def system_execute(self, command, path, out_file): 
    params_list = command.split(' ') 
    file_path = os.path.join(path, out_file) 
    f = open(file_path, "w") 
    subprocess.call(params_list, stdout=f) 
    f.close() 

(o, para el manejo de archivos más fácil,

[...] 
    with open(file_path, "w") as f: 
     subprocess.call(params_list, stdout=f) 
+0

Gracias, funciona –

Cuestiones relacionadas