2009-05-19 23 views

Respuesta

23

Puede redirigir directamente a un archivo usando subproceso.

import subprocess 
with open('output.txt', 'w') as output_f: 
    p = subprocess.Popen('Text/to/execute with-arg', 
         stdout=output_f, 
         stderr=output_f) 
7

La más fácil es os.system("the.exe -a >thefile.txt"), pero hay muchas otras formas, por ejemplo, con el módulo subprocess en la biblioteca estándar.

+0

cómo usar ese subproceso? – Kim

+0

Consulte http://docs.python.org/library/subprocess.html#replacing-os-system. –

+3

Vale la pena recordar que el símbolo de la tubería difiere entre los sistemas operativos cuando se intenta utilizar el sistema os.system para redirigir las cosas ... – mavnn

3

Puede hacer algo como esto p. leer salida de ls -l (o cualquier otro comando)

p = subprocess.Popen(["ls","-l"],stdout=subprocess.PIPE) 
print p.stdout.read() # or put it in a file 

que puede hacer algo similar para stderr/stdin

sino como Alex mencionó si lo que desea en un archivo, simplemente redirigir el cmd salida a un archivo

+0

Si se trata de un proceso prolongado, tenga en cuenta que stdout.read() está bloqueando. Deberá ejecutar el subproceso en un subproceso diferente si el script va a continuar haciendo cualquier otra cosa o responder a la salida 'en vivo'. – mavnn

0

Si solo desea ejecutar el ejecutable y esperar los resultados, la solución de Anurag es probablemente la mejor. Necesitaba responder a cada línea de salida cuando llegó y encontré que funcionaba lo siguiente:

1) Cree un objeto con un método de escritura (texto). Redirigir stdout a él (sys.stdout = obj). En su método de escritura, trate el resultado a medida que llega.

2) Ejecutar un método en un hilo separado con algo así como el código siguiente:

p = subprocess.Popen('Text/to/execute with-arg', stdout=subprocess.PIPE, 
         stderr=subprocess.PIPE, shell=False) 
    while p.poll() is None: 
     print p.stdout.readline().strip() 

Debido a que usted ha redireccionado la salida estándar, tubería se enviar la salida a la línea método de escritura por línea. Si no está seguro de que va a tener saltos de línea, también creo que leer (cantidad) funciona.

3) Recuerde para redirigir la salida estándar a la configuración predeterminada: sys.stdout = __sys.stdout__

0

Aunque parece que el título (.exe) es un problema en Windows. Tuve que compartir que la respuesta aceptada (subprocess.Popen() con argumentos stdout/stderr) no funcionó para mí en Mac OS X (10.8) con python 2.7.

Tuve que usar subprocess.check_output() (python 2.7 y superior) para que funcione. Ejemplo:

import subprocess 

cmd = 'ls -l' 
out = subprocess.check_output(cmd, shell=True) 
with open('my.log', 'w') as f: 
    f.writelines(out) 
    f.close() 

Tenga en cuenta que esta solución escribe toda la salida acumulada cuando finaliza el programa. Si desea supervisar el archivo de registro durante la ejecución. Es posible que desee probar algo más. En mi propio caso, solo me preocupé por el resultado final.

Cuestiones relacionadas