popen - problem mit stdout

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
JanDMC
User
Beiträge: 95
Registriert: Donnerstag 23. September 2004, 19:35
Kontaktdaten:

Freitag 1. Februar 2008, 14:03

Hallo Leute,

Ich habe mir viele Threads durchgelesen über subprocess etc. leider hab ich keine Lösung gefunden für folgendes Problem.

Ich benutze Ubuntu(7.10) und den Befehl 'unrar', der in der Shell enthalten ist. Nun übergebe ich 'unrar' Parameter zum Entpacken von RarArchiven, soweit so gut, funktioniert und mit

Code: Alles auswählen

stdout.read()
bekomme ich alle Zeilen aus der Shell umgeleitet in meine stdout variable.

Nun das Problem:

Angenommen das RarArchiv besteht aus 2 oder n Parts und es sind noch nicht alle vorhanden, dann wird alles soweit entpackt bis zu dem Part der fehlt. Auf der Shell wird dann sowas ausgegeben wie "Insert Disk with test.part2.rar" [C] continue [C] Cancel ". Genau diesen String möchte ich in der stdout haben. Wenn ich alles normal "per Hand" in die Shell eingebe wird letzeres auch angezeigt nur wenn ich alles mit

Code: Alles auswählen

subprocess.popen
anspreche hab ich das Gefühl, dass das Programm an der Stelle wartet und das Programm einfriert. Nur wenn diese Zeile nicht ausgegeben wird kann ich auch schlecht darauf reagieren.

Ich hoffe mein Problem ist klar geworden, ich bitte um Rat.

mfg

Jan =)

Code: Alles auswählen

command = 'unrar e -p%s %s %s' %(pw,dateipfad,zielpfad) 
terminalclient=subprocess.Popen(command, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)


joa nää python is toll :D
BlackJack

Freitag 1. Februar 2008, 14:16

Diese Fragen werden wahrscheinlich auf `stderr` ausgegeben und blockieren dort. Leite `stderr` am besten nicht mit `PIPE` um, sondern mit `STDOUT`, dann kommt alles bei `stdout` an.
JanDMC
User
Beiträge: 95
Registriert: Donnerstag 23. September 2004, 19:35
Kontaktdaten:

Freitag 1. Februar 2008, 14:24

Danke erstmal..

Wenn ich dich richtig verstanden habe sieht das nun folgendermaßen aus:

Code: Alles auswählen

terminalclient=subprocess.Popen(command, shell=True, stdin=subprocess.PIPE,stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
print terminalclient.stdout.read()
Wenn das so richtig ist dann funktioniert das auch leider nicht, gleicher Effekt, friert ein.

mfg
joa nää python is toll :D
BlackJack

Freitag 1. Februar 2008, 15:34

Naja das `read()` kehrt erst wieder zurück, wenn alles gelesen ist, also erst wenn ``unrar`` fertig ist. Das wird aber nie fertig, wenn es darauf wartet, dass der "Benutzer" eine Eingabe macht.

Das `pexpect`-Modul ist hier für Deine Zwecke wohl geeigneter.
Antworten