2010-10-20 9 views
7

J'appelle rtmpdump via subprocess et essaie de rediriger sa sortie vers un fichier. Le problème est que je ne peux tout simplement pas le rediriger.Python: Comment rediriger cette sortie?

J'ai d'abord essayé d'installer sys.stdout dans le fichier ouvert. Cela fonctionne pour, disons, ls, mais pas pour rtmpdump. J'ai également essayé de régler le sys.stderr juste pour s'assurer et cela n'a pas fonctionné.

J'ai essayé ensuite d'utiliser un ">> fichier" avec l'argument de la ligne de commande, mais encore une fois cela ne semble pas fonctionner.

Également pour l'enregistrement, pour une raison quelconque, Eclipse imprime la sortie de rtmpdump même si j'utilise subprocess.call au lieu de subprocess.check_output, et sans avoir à appeler la méthode d'impression. C'est de la magie noire!

Des suggestions?

Edit: Voici un exemple de code.

# /!\ 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' obtient habituellement redirigés vers' la stdout' du parent sans faire quoi que ce soit par défaut. Pourriez-vous poster le code que vous avez actuellement? –

+0

Voir ma réponse ci-dessous. Vous pouvez utiliser subprocess.popen (..) – pyfunc

+0

@pyfunc: J'essaie de comprendre comment utiliser popen, je vais essayer. – dmc

Répondre

16

sys.stdout est l'idée du flux de sortie du parent du python.

Dans tous les cas, vous souhaitez modifier le flux de sortie de l'enfant. Subprocess.call et subprocess.Popen prennent des paramètres nommés pour les flux de sortie.

Ouvrez donc le fichier que vous voulez éditer puis transmettez-le comme l'argument approprié du sous-processus.

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

Votre question d'utiliser >> vous suggérons utilisez shell = True, ou pensez que vous passez vos arguments à la coquille. En tout cas, il est préférable d'utiliser la forme de sous-processus de tableau, ce qui évite un processus inutile, et toute étrangeté du shell.

EDIT:

Je rtmpdump téléchargé et ai essayé, il semblerait les messages apparaissent sur stderr.

Donc, avec le programme suivant, rien n'apparaît à la sortie des programmes, et les journaux de rtmpdump quand dans le fichier 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

Tu m'as battu dessus. Essentiellement, ma réponse est la même. – pyfunc

+0

@Doubles Leeder: La sortie est toujours la console Eclipse avec ceci. :/ – dmc

+0

@dmc pouvez-vous exécuter 'rtmpdump' depuis la ligne de commande, en redirigeant stdout vers un fichier, et stderr vers un fichier différent, pour voir si la sortie est redirigée? –

1

Voir le lien à obtenir la sortie de sous-processus sur le SO

Je suppose que la voie serait de récupérer la sortie et l'écrire à un fichier directement ou fournir des descripteurs de fichiers à laquelle vous pouvez écrire.

Quelque chose comme ceci:

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

Bonne réponse, sauf que je ne recommanderais pas d'utiliser shell = True, sauf pour les conversions à partir du code existant. –

+0

@Douglas Leeder: Merci. C'est vrai. J'utilisais shell pour valider le code. – pyfunc

Questions connexes