Ich erstelle einen Prozess mit subprocess.Popen
und erhalte seinen stdout
. Ich möchte Inhalt von stdout
lesen und es in einem anderen Thread ausdrucken. Da es mein Ziel ist, später ein interaktives Programm zu erstellen, kann ich subprocess.communicate
nicht verwenden.Wie liest man den Stream eines Subprozesses in Python?
Meine Grundvoraussetzung ist: Sobald der Subprozess etwas ausgegeben hat, sollte der Thread ihn sofort auf den Bildschirm ausgeben.
Hier ist der Code
import subprocess
import thread
import time
def helper(s):
print "start",time.gmtime()
while True:
print "here"
print s.next()
print "finished",time.gmtime()
thread.start_new_thread(helper,(out_stream,))
def process_main():
global stdin_main
global stdout_main
p = subprocess.Popen("/bin/bash", shell=False, stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT, bufsize=0)
stdin_main = p.stdin
stdout_main = p.stdout
th1 = thread_print_stream(stdout_main)
stdin_main.write("ls -la\n")
stdin_main.flush()
time.sleep(30)
p.terminate()
process_main()
Zeit verstreichen zwischen "Start" und "fertig" sollte sehr schnell sein. Es sind jedoch 30 Sekunden, was genau der Zeit entspricht, bevor der Prozess beendet wurde. Ich kann nicht verstehen, warum die Ausgabe keine Instanz ist. Oder wie kann ich es instanziell machen?
Sie leiden wahrscheinlich unter Pufferung. Dies könnte helfen: http://stackoverflow.com/questions/1183643/unbuffered-read-from-process-using-subprocess-in-python – cdarke
@cdarke leidet unter Unterprozess oder Datei? Ich habe bufsize = 0 gesetzt. – worldterminator
Haben Sie die akzeptierte Antwort im Link gelesen? – cdarke