2010-10-20 27 views
7

Sto chiamando rtmpdump tramite sottoprocesso e sto provando a reindirizzare il suo output su un file. Il problema è che semplicemente non riesco a reindirizzare.Python: come faccio a reindirizzare questo output?

Ho provato prima la configurazione di sys.stdout nel file aperto. Funziona per, per esempio, ls, ma non per rtmpdump. Ho anche provato a impostare sys.stderr solo per essere sicuro e non ha funzionato.

Ho provato quindi a utilizzare un "file" con l'argomento della riga di comando, ma ancora non sembra funzionare.

Anche per la registrazione, per qualche motivo, Eclipse stampa l'output di rtmpdump anche se utilizzo subprocess.call anziché subprocess.check_output e senza dover chiamare il metodo di stampa. Questa è magia nera!

Qualche suggerimento?

Modifica: ecco alcuni esempi di codice.

# /!\ 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' di solito viene reindirizzato a' stdout' del genitore senza fare niente per impostazione predefinita. Potresti pubblicare il codice che hai attualmente? –

+0

Vedere la mia risposta qui sotto. Potresti usare subprocess.popen (..) – pyfunc

+0

@pyfunc: Sto cercando di capire come usare il popen, ci proverò. – dmc

risposta

16

sys.stdout è l'idea del pitone del flusso di output del genitore.

In ogni caso, si desidera modificare il flusso di output del figlio.

subprocess.call e subprocess.Popen prendono i parametri denominati per i flussi di output.

Quindi aprire il file a cui si desidera eseguire l'output e quindi passarlo come argomento appropriato per sottoprocesso.

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

vostro parlare di utilizzare >> suggeriscono che si sta utilizzando shell = True, o pensa si passa le sue argomentazioni alla shell. In ogni caso è meglio usare la forma dell'array del sottoprocesso, che evita un processo non necessario e qualsiasi stranezza dalla shell.

EDIT:

Così ho scaricato rtmpdump e ha cercato fuori, sembrerebbe che i messaggi sono visualizzati su stderr.

Quindi, con il seguente programma, non viene visualizzato nulla sull'uscita programmi ei registri rtmpdump quando nel file 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

Mi hai battuto. Essenzialmente la mia risposta è la stessa. – pyfunc

+0

@Doubles Leeder: Output è ancora la console Eclipse con questo. :/ – dmc

+0

@dmc è possibile eseguire 'rtmpdump' dalla riga di comando, reindirizzando lo stdout in un file e stderr in un altro file, per vedere se l'output viene reindirizzato? –

1

vedi il link su come ottenere l'uscita dal sottoprocesso su SO

Credo che il modo sarebbe quello di raccogliere l'output e lo scriverà in un file direttamente o fornire i descrittori di file a cui si può scrivere l'output.

Qualcosa di simile a questo:

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

Buona risposta eccetto che non raccomanderei l'uso di shell = True tranne per le conversioni da codice legacy. –

+0

@Douglas Leeder: Grazie. Giusto. Stavo usando shell per convalidare il codice. – pyfunc

Problemi correlati