2012-03-30 3 views
4

Ich wollte ein Python-Skript implementieren, die ein anderes Skript aufgerufen und erfasst sein stdout. Die gerufene Skript enthält einige Ein- und Ausgabenachrichten zBGetting stdout zur Anzeige aufgerufen Skript mit Eingabe

print ("Line 1 of Text") 
variable = raw_input("Input 1 :") 
print "Line 2 of Text Input: ", vairable 

Der Abschnitt der Code, den ich laufen bin ist

import subprocess 

cmd='testfile.py' 
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE) 
so, se = p.communicate() 
print(so) 

Das Problem, das auftritt, ist, dass die stdout erst nach der druckt Skript wurde ausgeführt. Dies lässt eine leere Eingabeaufforderung, die auf die Benutzereingabe wartet. Gibt es eine Möglichkeit, das stdout zu drucken, während das aufgerufene Skript noch läuft?

Danke,

+0

Von hier: http: // Stackoverflow.com/Fragen/230.751/how-to-UP-Ausgabe-of-Python-Print import sys sys.stdout.flush() –

+0

Welche OS zielen Sie ab? Es gibt einige Verrücktheiten bei Windows mit dieser Art von Anwendung – Fuzz

+0

@Fuzz Das Skript muss auf Windows XP und 7 – Scavenger

Antwort

3

Hier gibt es zwei Probleme.

  1. Erstens python puffert Ausgabe auf stdout und Sie müssen dies verhindern. Sie könnten einen Anruf an sys.stdout.flush() in testfile.py, wie Ilia Frenkel vorgeschlagen hat, einfügen, oder Sie können python -u verwenden, um testfile.py mit ungepufferten E/A auszuführen. (Siehe die other stack overflow question, mit der Ilia verbunden ist.)

  2. Sie benötigen eine Möglichkeit zum asynchronen Lesen von Daten aus dem Unterprozess und dann, wenn es bereit für die Eingabe ist, Drucken der Daten, die Sie gelesen haben, so dass die Eingabeaufforderung für Der Benutzer erscheint. Dafür wäre es sehr hilfreich, eine asynchronous version of the subprocess module zu haben.

heruntergeladen ich die asynchrone subprocess und wieder schrieb das Skript, es zu benutzen, zusammen python -u mit der Verwendung von ungepufferten I/O zu erhalten:

import async_subprocess as subprocess 

cmd = ['python', '-u', 'testfile.py'] 
p = subprocess.Popen(cmd, stdout=subprocess.PIPE) 
so = p.asyncread() 
print so, 
(so, se) = p.communicate() 
print so 

Wenn ich dieses Skript ausführen mit python -u ich das bekommen folgende Ergebnisse:

$ python -u script.py 
Line 1 of Text 
Input 1: 

und das Skript pausiert und wartet auf Eingabe. Dies ist das gewünschte Ergebnis.

Wenn ich dann etwas (zum Beispiel "Hallo") Typ erhalte ich folgendes:

$ python -u script.py 
Line 1 of Text 
Input 1:Hullo 
Line 2 of Text Input: Hullo 
+0

Danke! Es funktioniert gut, aber wenn der Inhalt der Testdatei sich ändert und eine zweite Eingabe hat, dann hört es auf zu funktionieren, weil communicate() ausgeführt wird, bis es das Ende der Datei erreicht – Scavenger

1

Sie brauchen nicht es stdout wirklich zu erfassen, muß nur das Programm Kind seine Sachen ausdrucken und beenden, anstatt die Ausgabe in der übergeordneten Programm Fütterung und dort drucken. Wenn Sie eine variable Ausgabe benötigen, verwenden Sie stattdessen eine Funktion.

Aber sowieso, das hast du nicht gefragt.

Ich habe tatsächlich diese aus einem anderen Stackoverflow Frage:

import subprocess, sys 
cmd='testfile.py' 
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE) 
while True: 
    out = p.stdout.read(20) 
    if out == '' and p.poll() != None: 
     break 
    if out != '': 
     sys.stdout.write(out) 
     sys.stdout.flush() 

Erstens, es öffnet sich Ihr Prozess: dann liest er ständig die Ausgabe von p und druckt sie auf den Bildschirm sys.stdout.write verwenden. Der Teil, der dies alles funktioniert, ist sys.stdout.flush(), die kontinuierlich die Ausgabe des Programms "ausspülen" wird.

+0

ausführen @ bear605 Ich führe den Code, aber es funktioniert nicht. Der erste Druckbefehl wird nicht angezeigt und das Skript bleibt mit einem Tastendruck stecken, der nichts bewirkt. Es könnte sein, weil ich auf Windows laufe. – Scavenger

Verwandte Themen