2010-10-20 28 views
7

Llamo a rtmpdump por subproceso y trato de redirigir su salida a un archivo. El problema es que simplemente no puedo redirigirlo.Python: ¿Cómo redirijo esta salida?

Intenté primero configurar el sys.stdout en el archivo abierto. Esto funciona para, digamos, ls, pero no para rtmpdump. También intenté configurar el sys.stderr solo para asegurarme y tampoco funcionó.

Intenté entonces usar un ">> archivo" con el argumento de la línea de comandos, pero de nuevo parece que no funciona.

También para el registro, por alguna razón, Eclipse imprime la salida de rtmpdump incluso si utilizo subprocess.call en lugar de subprocess.check_output, y sin tener que llamar al método de impresión. ¡Esto es magia negra!

¿Alguna sugerencia?

Editar: Aquí hay algunos ejemplos de código.

# /!\ note: need to use os.chdir first to get to the folder with rtmpdump! 
    command = './rtmpdump -r rtmp://oxy.videolectures.net/video/ -y 2007/pascal/bootcamp07_vilanova/keller_mikaela/bootcamp07_keller_bss_01 -a video -s http://media.videolectures.net/jw-player/player.swf -w ffa4f0c469cfbe1f449ec42462e8c3ba16600f5a4b311980bb626893ca81f388 -x 53910 -o test.flv' 
    split_command = shlex.split(command) 
    subprocess.call(split_command) 
+0

'stdout' por lo general se le redirecciona a' stdout' de los padres sin hacer nada por defecto. ¿Podría publicar el código que tiene actualmente? –

+0

Ver mi respuesta a continuación. Podría usar subprocess.popen (..) – pyfunc

+0

@pyfunc: Estoy tratando de entender cómo usar popen, lo intentaré. – dmc

Respuesta

16

sys.stdout es la idea de la pitón de flujo de salida de los padres.

En cualquier caso, desea cambiar la secuencia de salida del elemento secundario.

subprocess.call y subprocess.Popen toman los parámetros con nombre para las secuencias de salida.

Abra el archivo que desea generar y pase ese argumento como el adecuado para el subproceso.

f = open("outputFile","wb") 
subprocess.call(argsArray,stdout=f) 

Su charla de utilizar >> sugieren que está utilizando la cáscara = True, o cree que está pasando sus argumentos a la cáscara. En cualquier caso, es mejor utilizar la forma de matriz del subproceso, que evita un proceso innecesario y cualquier rareza del shell.

EDIT:

lo que he descargado rtmpdump y lo probé, al parecer los mensajes están apareciendo en stderr.

Así, con el siguiente programa, no aparece nada en la salida de los programas, y los registros de rtmpdump cuando en el archivo stderr.txt:

#!/usr/bin/env python 

import os 
import subprocess 

RTMPDUMP="./rtmpdump" 
assert os.path.isfile(RTMPDUMP) 
command = [RTMPDUMP,'-r','rtmp://oxy.videolectures.net/video/', 
     '-y','2007/pascal/bootcamp07_vilanova/keller_mikaela/bootcamp07_keller_bss_01', 
     '-a','video','-s', 
     'http://media.videolectures.net/jw-player/player.swf', 
     '-w','ffa4f0c469cfbe1f449ec42462e8c3ba16600f5a4b311980bb626893ca81f388' 
     ,'-x','53910','-o','test.flv'] 


stdout = open("stdout.txt","wb") 
stderr = open("stderr.txt","wb") 
subprocess.call(command,stdout=stdout,stderr=stderr) 
+0

Me ganaste. Esencialmente mi respuesta es la misma. – pyfunc

+0

@Doubles Leeder: La salida sigue siendo la consola Eclipse con esto. :/ – dmc

+0

@dmc ¿podría ejecutar 'rtmpdump' desde la línea de comando, redireccionando stdout a un archivo, y stderr a un archivo diferente, para ver si la salida se redirecciona? –

1

Ver el enlace en conseguir la salida de subproceso de SO

supongo que la forma sería la de recoger el producto y escribirla en un archivo directamente o proporcionar descriptores de archivos a los que se puede escribir.

Algo como esto:

f = open('dump.txt', 'wb') 
p = subprocess.Popen(args, stdout=f, stderr=subprocess.STDOUT, shell=True) 
+1

Buena respuesta, excepto que no recomendaría usar shell = True excepto las conversiones del código heredado. –

+0

@Douglas Leeder: Gracias. Está bien. Estaba usando shell para validar el código. – pyfunc

Cuestiones relacionadas