2010-10-20 3 views
7

Я вызываю rtmpdump через подпроцесс и пытаюсь перенаправить его вывод в файл. Проблема в том, что я просто не могу перенаправить ее.Python: Как перенаправить этот вывод?

Я попытался сначала установить sys.stdout в открытый файл. Это работает, скажем, ls, но не для rtmpdump. Я также попытался установить sys.stderr, чтобы убедиться, и он также не работал.

Я попытался использовать «>> файл» с аргументом командной строки, но опять же он не работает.

Также для записи Eclipse по какой-либо причине печатает вывод rtmpdump, даже если я использую subprocess.call вместо subprocess.check_output и не требует вызова метода печати. Это черная магия!

Любые предложения?

Редактировать: Вот пример кода.

# /!\ 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' обычно перенаправляется на' stdout' родителя, ничего не делая по умолчанию. Не могли бы вы опубликовать код, который у вас есть? –

+0

См. Мой ответ ниже. Вы можете использовать subprocess.popen (..) – pyfunc

+0

@pyfunc: Я пытаюсь понять, как использовать popen, я попробую. – dmc

ответ

16

sys.stdout является идея питона выходного потока родителя.

В любом случае вы хотите изменить выходной поток ребенка.

subprocess.call и subprocess.Popen принимают именованные параметры для выходных потоков.

Итак, откройте файл, который хотите вывести, а затем передайте его как соответствующий аргумент для подпроцесса.

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

Ваш разговор с помощью >> предложить вы используете оболочку = True, или думаете, что вы передаете свои аргументы оболочки. В любом случае лучше использовать форму массива подпроцесса, которая позволяет избежать ненужного процесса и любой странности из оболочки.

EDIT:

Я скачал RTMPDump и попробовал его, казалось бы, сообщения будут появляться на STDERR.

Так со следующей программой, на выходе программы ничего не появляется, и журналы rtmpdump, когда в файл 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

Ты избил меня. По сути, мой ответ тот же. – pyfunc

+0

@ Doubles Leeder: выход по-прежнему является консолью Eclipse. :/ – dmc

+0

@dmc вы могли бы запустить 'rtmpdump' из командной строки, перенаправляя stdout в один файл и stderr в другой файл, чтобы посмотреть, перенаправляется ли выход? –

1

Смотрите ссылку на получение выхода из подпроцесса на SO

Я думаю, как бы собрать вывод и записать его на файл напрямую или предоставить файловые дескрипторы, к которым вы можете написать.

Что-то вроде этого:

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

Хороший ответ, за исключением того, что я бы не рекомендовал использовать shell = True, кроме конверсий из устаревшего кода. –

+0

@Douglas Leeder: Спасибо. Это верно. Я использовал оболочку для проверки кода. – pyfunc

Смежные вопросы