2009-06-12 11 views
21

Estoy tratando de iniciar una 'rsync' utilizando el módulo de subproceso y Popen dentro de un hilo. Después de llamar a rsync también necesito leer la salida. Estoy usando el método de comunicación para leer la salida. El código funciona bien cuando no uso un hilo. Parece que cuando uso un hilo cuelga en la llamada de comunicación. Otra cosa que noté es que cuando configuro shell = False, no recibo nada de la comunicación cuando se ejecuta en un hilo.Python Subprocess.Popen a partir de un hilo

Respuesta

33

no aparece ninguno ningún código para que veamos, pero esto es una muestra que hace algo similar a lo que usted describe:

import threading 
import subprocess 

class MyClass(threading.Thread): 
    def __init__(self): 
     self.stdout = None 
     self.stderr = None 
     threading.Thread.__init__(self) 

    def run(self): 
     p = subprocess.Popen('rsync -av /etc/passwd /tmp'.split(), 
          shell=False, 
          stdout=subprocess.PIPE, 
          stderr=subprocess.PIPE) 

     self.stdout, self.stderr = p.communicate() 

myclass = MyClass() 
myclass.start() 
myclass.join() 
print myclass.stdout 
+0

Sí, eso es más o menos exactamente lo que estoy haciendo. Sin embargo, me gustaría que me leyeran el resultado dentro del hilo. También debería notar que estoy usando Python 2.3. Agarré una copia del subproceso de 2.4. – noahd

+0

marque esto como "respondido" –

+0

Debería ser más claro que eso es lo que estoy haciendo, pero no funciona. En este caso, la llamada de comunicación no devolverá nada y el comando no parece ejecutarse. Si configuro shell = True, la comunicación cuelga el hilo. Luego, después de detener el pitón, termino con un proceso ssh difunto. – noahd

9

Aquí es una gran aplicación que no utilizan hilos: constantly-print-subprocess-output-while-process-is-running

import subprocess 

def execute(command): 
    process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 
    output = '' 

    # Poll process for new output until finished 
    for line in iter(process.stdout.readline, ""): 
     print line, 
     output += line 


    process.wait() 
    exitCode = process.returncode 

    if (exitCode == 0): 
     return output 
    else: 
     raise Exception(command, exitCode, output) 

execute(['ping', 'localhost']) 
+4

Cabe señalar que esta implementación se bloqueará en 'process.stdout.readline()'. – Ian

Cuestiones relacionadas