2010-10-20 3 views
7

Ich rtmpdump über Subprozess aufrufen und versuchen, seine Ausgabe in eine Datei umzuleiten. Das Problem ist, dass ich es einfach nicht umleiten kann.Python: Wie leite ich diese Ausgabe um?

Ich versuchte zuerst, die sys.stdout auf die geöffnete Datei einzurichten. Dies funktioniert zum Beispiel für ls, aber nicht für rtmpdump. Ich habe auch versucht, die sys.stderr nur um sicherzustellen, und es hat auch nicht funktioniert.

Ich versuchte dann mit einer ">> file" mit dem Kommandozeilenargument, aber es scheint wieder nicht zu funktionieren.

Auch für die Aufzeichnung, aus irgendeinem Grund, druckt Eclipse rtmpdump die Ausgabe, auch wenn ich subprocess.call anstelle von subprocess.check_output verwenden, und ohne die Druckmethode aufrufen müssen. Das ist schwarze Magie!

Irgendwelche Vorschläge?

Edit: Hier ist ein Beispielcode.

# /!\ 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' in der Regel auf die' stdout' der Eltern umgeleitet wird, ohne etwas zu tun standardmäßig. Könnten Sie den Code, den Sie gerade haben, posten? –

+0

Siehe meine Antwort unten. Sie könnten subprocess.popen (..) verwenden – pyfunc

+0

@pyfunc: Ich versuche zu verstehen, wie man popen verwendet, ich werde es versuchen. – dmc

Antwort

16

sys.stdout ist die Idee der Python des Ausgangsstroms der Eltern.

In jedem Fall möchten Sie den Ausgabestrom des untergeordneten Elements ändern.

subprocess.call und subprocess.Popen nehmen benannte Parameter für die Ausgabeströme.

So öffnen Sie die Datei, die Sie ausgeben möchten, und übergeben Sie diese dann als das entsprechende Argument an Subprozess.

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

Ihre Rede >> der Verwendung schlagen Sie Shell verwenden = True, oder denken Sie Ihre Argumente an die Shell übergeben. In jedem Fall ist es besser, die Array-Form des Subprozesses zu verwenden, die einen unnötigen Prozess und jegliche Verrücktheit aus der Shell vermeidet.

EDIT:

Also habe ich heruntergeladen rtmpdump und probierte es aus, würde es die Nachrichten auf stderr erscheinen erscheinen.

Also mit dem folgende Programm erscheint nichts auf dem Programm ausgegeben, und die rtmpdump Protokolle, wenn sie in die stderr.txt Datei:

#!/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

Sie haben mich dazu geschlagen. Im Wesentlichen ist meine Antwort die gleiche. – pyfunc

+0

@Doubles Leeder: Ausgabe ist immer noch die Eclipse-Konsole mit diesem. :/ – dmc

+0

@dmc könnten Sie 'rtmpdump' von der Befehlszeile ausführen, stdout in eine Datei umleiten und stderr in eine andere Datei um zu sehen, ob die Ausgabe umgeleitet wird? –

1

Siehe den Link auf die Ausgabe von subprocess immer auf SO

ich die Art und Weise denke, die Ausgabe und schreiben Sie es auf eine wäre zu sammeln Datei direkt eingeben oder Dateideskriptoren bereitstellen, in die Sie schreiben können.

Etwas wie folgt aus:

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

Gute Antwort, außer ich würde die Verwendung von Shell = True mit Ausnahme von Konvertierungen aus Legacy-Code nicht empfehlen. –

+0

@ Douglas Leeder: Danke. Stimmt. Ich habe Shell verwendet, um den Code zu validieren. – pyfunc