python
  • popen
  • 2012-01-17 9 views 8 likes 
    8

    Intentando redirigir la salida de un subproceso a un archivo.subproceso.Popen() IO redirect

    server.py:

    while 1: 
        print "Count " + str(count) 
        sys.stdout.flush() 
        count = count + 1 
        time.sleep(1) 
    

    Laucher:

    cmd = './server.py >temp.txt' 
    args = shlex.split(cmd) 
    server = subprocess.Popen(args) 
    

    La salida aparecen en la pantalla, temp.txt permanece vacío. ¿Qué estoy haciendo mal?

    Como fondo, intento capturar el resultado de un programa que ya se ha escrito.

    no puedo usar:

    server = subprocess.Popen(
           [exe_name], 
           stdin=subprocess.PIPE, stdout=subprocess.PIPE) 
    

    ya que el programa no puede ras. En cambio, iba a redirigir la salida a través de una fifo. Esto funciona bien si ejecuto Server.py manualmente, pero obviamente no si I Popen() causa que la redirección no funcione. ps -aux muestra que server.py se inició correctamente.

    Respuesta

    7

    Altenatively, puede utilizar el parámetro stdout con un objeto de archivo:

    with open('temp.txt', 'w') as output: 
        server = subprocess.Popen('./server.py', stdout=output) 
        server.communicate() 
    

    Como se explica en la documentation:

    stdin, stdout y stderr especifique el ejecutados de entrada de programa estándar, salida estándar y archivo de error estándar, respectivamente. Los valores válidos son PIPE, un descriptor de archivo existente (un entero positivo), un objeto de archivo existente y None.

    +0

    Eso funciona. Comunicar bloquearía el lector hasta que el servidor finalice, pero ahora que puedo redirigir puedo enviar la salida del servidor a una fifo. –

    +1

    no es necesario llamar '.communicate()' aquí. 'subprocess.check_call ('command', stdout = file)' funciona. – jfs

    4

    La redirección de salida con ">" es una característica de las shells; de manera predeterminada, subprocess.Popen no crea una instancia. Esto debería funcionar:

    server = subprocess.Popen(args, shell=True) 
    
    +0

    Usar 'shell = True' no es la forma preferida, a menos que sea necesario (y aquí no está) – wim

    Cuestiones relacionadas