subprocess redirect

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
SElsner
User
Beiträge: 15
Registriert: Dienstag 22. Juli 2008, 14:24

Hallo,

ich starte ein Programm mit:

handle=subprocess.Popen(cmd,stdout=subprocess.PIPE)

und lese den output, wenn es fertig ist mit:

result=handle.stdout.readlines()

um den stdout nach fehlern zu checken.

Das Problem ist nun, dass der output dann aber in der console nicht mehr in realtime angezeitgt wird (ein fortschrittsbalken waehrend das programm laeuft). Kann ich irgendwie beides haben, also nen realtime output nun am ende dann alles, was er ausgespuckt hat?

Gruss

Sebastian
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

SElsner hat geschrieben: Das Problem ist nun, dass der output dann aber in der console nicht mehr in realtime angezeitgt wird
In welcher Konsole?
(ein fortschrittsbalken waehrend das programm laeuft)
Ich dachte es wird nichts mehr angezeigt? :?:

Bitte präzisiere doch mal die Anfrage.
SElsner
User
Beiträge: 15
Registriert: Dienstag 22. Juli 2008, 14:24

Ok, ein funktionierendes Beispiel:

kopiere das hier bitte in eine bat datei, die in c:\test.bat liegt.

choice /d y /t 2 > NUL
echo hallo
choice /d y /t 2 > NUL

die bat wartet zuerst zwei sekunden, gibt dann hallo aus und wartet dann wieder zwei sekunden.

der code fuehrt die bat aus.

Code: Alles auswählen

import subprocess

h=subprocess.Popen("C:\\test.bat",stdout=subprocess.PIPE)
res=h.stdout.readlines()
print res
dabei springt ein dos fenster auf. in diesem fenster wuerde ich gerne das "hallo" aus der bat lesen, aber ich sehe nichts. weil der output nicht mehr ins fenster geht sondern in stdout. Ich haette aber gerne, dass sowohl im fenster geprinted wird, als auch gleichzeitig ins stdout geschrieben wird, so dass ich den output nach ende des programms auslesen kann.

gruss

Sebastian[/quote]
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

Wie passt denn
SElsner hat geschrieben:und lese den output, wenn es fertig ist mit:
und
SElsner hat geschrieben:Das Problem ist nun, dass der output dann aber in der console nicht mehr in realtime angezeigt wird
zusammen?
Wenn du dem Programm beim arbeiten zuschauen willst, musst du das auch machen :twisted: , d.h. während das Programm läuft, dessen stdout auslesen und verarbeiten, bzw. ausgeben.

Falls dir aber niemand helfen kann, poste mehr Code!

hth, Jörg
edit:(Ich hätte doch 'vorschauen' sollen)
dabei springt ein dos fenster auf. in diesem fenster wuerde ich gerne das "hallo" aus der bat lesen, aber ich sehe nichts. weil der output nicht mehr ins fenster geht sondern in stdout. Ich haette aber gerne, dass sowohl im fenster geprinted wird, als auch gleichzeitig ins stdout geschrieben wird, so dass ich den output nach ende des programms auslesen kann.
Das Fenster ist stdout - wenn das batchfile 'allein' läuft.
AFAIK geht das was dir vorschwebt nur über ein tempfile/socket, also einen weiteren 'Dateidescriptor' oder mit sowas wie dem Windows-Äquivalent zu 'tee'.
Kann dein Pythonprogramm nicht kurz das Terminal für die Ausgaben zur Verfügungstellen?
Dann brauchst du nur den stdout vom subprocess.Popen zeilenweise zu lesen, speichern und ausgeben (ggf. in einem extra threading.Thread)
Antworten