2010-10-20 13 views
7

Wywołuję rtmpdump poprzez podproces i próbuję przekierować jego wyjście do pliku. Problem polega na tym, że po prostu nie mogę go przekierować.Python: Jak mogę przekierować to wyjście?

Próbowałem najpierw skonfigurować sys.stdout do otwartego pliku. Działa to dla, powiedzmy, ls, ale nie dla rtmpdump. Próbowałem również ustawić sys.stderr tylko po to, aby się upewnić, a także nie działało.

Próbowałem następnie używając ">> pliku" z argumentem wiersza poleceń, ale znowu nie wydaje się działać.

Również dla rekordu, z jakiegoś powodu, Eclipse drukuje dane wyjściowe rtmpdump, nawet jeśli używam subprocess.call zamiast subprocess.check_output i bez konieczności wywoływania metody drukowania. To jest czarna magia!

Wszelkie sugestie?

Edytuj: Oto przykładowy kod.

# /!\ 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' zwykle zostaje przekierowany do rodzica' stdout' bez robienia czegokolwiek domyślnie. Czy możesz opublikować kod, który masz obecnie? –

+0

Zobacz poniżej moją odpowiedź. Możesz użyć podprocesu.popen (..) – pyfunc

+0

@pyfunc: Próbuję zrozumieć, jak używać popena, spróbuję. – dmc

Odpowiedz

16

sys.stdout jest idea pytona jest strumienia wyjściowego rodzica.

W każdym przypadku chcesz zmienić wyjściowy strumień potomny.

subprocess.call i subprocess.Popen przyjmują nazwane parametry dla strumieni wyjściowych.

Otwórz plik, który chcesz wyprowadzić, a następnie przekaż go jako odpowiedni argument do podprocesu.

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

Twoja rozmowa z użyciem >> sugerują używasz shell = True, lub uważasz, że przekazując swoje argumenty do powłoki. W każdym przypadku lepiej jest użyć formy tablicowej podprocesu, co pozwoli uniknąć niepotrzebnego procesu i wszelkiej dziwności z powłoki.

EDIT:

Więc ściągnąłem RTMPDump i próbował go, wydaje się, że komunikaty są wyświetlane na stderr.

Więc z następującym programem, nic na wyjściu programów pojawia się i loguje rtmpdump gdy w pliku 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

Uderzyłeś mnie do tego. Zasadniczo moja odpowiedź jest taka sama. – pyfunc

+0

@Doubles Leeder: Wyjście to nadal konsola Eclipse. :/ – dmc

+0

@dmc można uruchomić 'rtmpdump' z wiersza poleceń, przekierowując stdout do jednego pliku i stderr do innego pliku, aby sprawdzić, czy dane wyjściowe nie są przekierowywane? –

1

Zobacz link na uzyskanie wyjście z podproces na SO

Chyba sposobem byłoby gromadzić dane wyjściowe i zapisać go na plik bezpośrednio lub podaj deskryptory plików, które można zapisać.

coś takiego:

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

Dobra odpowiedź, z tym wyjątkiem, że nie polecam używania powłoki shell = True z wyjątkiem konwersji ze starego kodu. –

+0

@Douglas Leeder: Dzięki. Zgadza się. Używałem powłoki do sprawdzania poprawności kodu. – pyfunc

Powiązane problemy