subprocess: Ausgabe in String schreiben

27/12/2008 - 17:19 von Florian Lindner | Report spam
Hallo,

ich habe ein kleines Programm in dem 2 Threads FLAC Dateien nach mp3
konvertieren:

ofile = StringIO.StringIO()
pFlac = Popen( (decoderCommand % source), stdout=PIPE, shell=True)
pLame = Popen( (encoderCommand % target), stdin=pFlac.stdout,
stdout=ofile, shell=True)
stdout, stderr = pLame.communicate()

Wenn ich beim Aufruf des Encoders den Parameter stdout nicht angeben,
wird es einfach auf die Shell von der ich das Programm aufrufe
geschrieben. Prinzipiell ist das zwar ok, aber bei mehr als einen
Thread wird da wild durcheinander geschrieben. Deshalb will ich die
Ausgabe erstmal cachen und spàter (evtl. auch nur im Fehlerfall)
ausgeben.
Obige Konstruktion mit StringIO erzeugt bei besagter Zeile den Fehler,
dass das StringIO Objekt das Attribut fileno nicht besitzt.

Wie behandle ich obigen Fall am besten? (es muss nicht genau das sein,
aber wie wird es üblicherweise gemacht, wenn zwei Threads gleichzeitig
nach stdout scheiben wollen?)

Danke & Grüße,

Florian
 

Lesen sie die antworten

#1 Marc BlackJack Rintsch
27/12/2008 - 23:12 | Warnen spam
On Sat, 27 Dec 2008 08:19:09 -0800, Florian Lindner wrote:

ich habe ein kleines Programm in dem 2 Threads FLAC Dateien nach mp3
konvertieren:

ofile = StringIO.StringIO()
pFlac = Popen( (decoderCommand % source), stdout=PIPE, shell=True)
pLame = Popen( (encoderCommand % target), stdin=pFlac.stdout,
stdout=ofile, shell=True)
stdout, stderr = pLame.communicate()



Das sind vier Prozesse (flac, lame, und zwei Shells) und keine zwei
Threads.

Warum ``shell=True`` und das Kommando als eine Zeichenkette, also mit
zwei unnötigen Shell-Prozessen und den Problemen die dadurch entstehen
können, dass die Kommandozeile noch einmal von einer Shell interpretiert
wird?

Wenn ich beim Aufruf des Encoders den Parameter stdout nicht angeben,
wird es einfach auf die Shell von der ich das Programm aufrufe
geschrieben. Prinzipiell ist das zwar ok, aber bei mehr als einen Thread
wird da wild durcheinander geschrieben. Deshalb will ich die Ausgabe
erstmal cachen und spàter (evtl. auch nur im Fehlerfall) ausgeben.
Obige Konstruktion mit StringIO erzeugt bei besagter Zeile den Fehler,
dass das StringIO Objekt das Attribut fileno nicht besitzt.

Wie behandle ich obigen Fall am besten? (es muss nicht genau das sein,
aber wie wird es üblicherweise gemacht, wenn zwei Threads gleichzeitig
nach stdout scheiben wollen?)



Wo wollen da zwei Prozesse gleichzeitig nach stdout schreiben?

Man könnte stdout von `pLame` mit `PIPE` umlenken und dann eben auslesen.

Ciao,
Marc 'BlackJack' Rintsch

Ähnliche fragen