Subprocess will nicht so wie ich es will :)

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
danvari
User
Beiträge: 3
Registriert: Samstag 23. August 2008, 13:21

hallo!

ich habe angefangen mich in python einzulesen und möchte nun ein wrapper für mencoder schreiben, was soweit auch gut geklappt hat. nun möchte ich jedoch auch den output von mencoder einschränken, d.h. ich möchte den output abfangen, parsen und neu ausgeben. mencoder gibt _ständig_ neuen output aus und gerade das ist mein problem.
hier ein knappes beispiel:

Code: Alles auswählen

import subprocess
import time

proc = subprocess.Popen("mencoder ...", stdout = subprocess.PIPE)

while 1:
          time(1)
          print proc.stdout.readline()

dies wirft mir zwar jede sekunde eine zeile raus, das problem ist hier nur, dass es keine "aktuelle" zeile ist, sondern schon etwas älter (in der einen sekunde hat mencoder vermutlich 1000 zeilen rausgeworfen und ich fange die erste ab).
ich will aber, dass er mir die aktuellste zeile rauswirft. wie mache ich das? ich hatte eigentlich gedacht, ich könnte mit lines = readlines() alle zeilen abfangen (und den "speicher" löschen?) und dann mit lines[-1] die letzte zeile rausfischen, aber das klappt leider nicht. ich erhalte kein output :(...
BlackJack

In der einen Sekunde hat `mencoder` wahrscheinlich nicht 1000 Zeilen geschrieben, sondern wartet gemütlich bis Du endlich mal die Ausgabe des Programms abnimmst. Es gibt zwar wahrscheinlich einen Puffer, aber der dürfte so in der Grössenordnung von 4 KiB liegen.

Du müsstest ständig Zeilen lesen und immer schauen, ob seit der letzen Ausgabe von Dir schon mindestens eine Sekunde vergangen ist -- wenn ja, dann kannst Du die aktuelle Zeile ausgeben.

Ausserdem wäre es möglich, dass die Statusinformationen von `mencoder` auf "stderr" und nicht auf "stdout" raus gehen.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Zeile 8 kann so aber auch nicht stimmen.
danvari
User
Beiträge: 3
Registriert: Samstag 23. August 2008, 13:21

Code: Alles auswählen

Zeile 8 kann so aber auch nicht stimmen.
wieso?

also es ist so, dass nur der anfang von mencoder gepuffert wird, den bekomme ich auch problemlos ausgegeben. danach stoppt die ausgabe, das programm läuft aber weiter. ich habe mal im internet ein wenig geforscht und herausgefunden, dass der rest tatsächlich nicht gepuffert wird und mit subprocess bzw. read* nicht ausgewertet werden kann.

was mache ich dann?
BlackJack

@danvari: Zeile 8 kann nicht stimmen weil Module nicht aufrufbar sind:

Code: Alles auswählen

In [7]: import time

In [8]: time(1)
---------------------------------------------------------------------------
<type 'exceptions.TypeError'>             Traceback (most recent call last)

/home/bj/<ipython console> in <module>()

<type 'exceptions.TypeError'>: 'module' object is not callable
danvari
User
Beiträge: 3
Registriert: Samstag 23. August 2008, 13:21

ich meinte auch time.sleep(1) ^^

was mache ich nun :-\?...nichts?
BlackJack

Vielleicht mal das Modul `pexpect` versuchen.
Antworten