Say Ich schreibe diesen:Gibt es eine Möglichkeit, ein Dateihandle abzurufen, das von subprocess.Popen zurückgegeben wird?
from subprocessing import Popen, STDOUT, PIPE
p = Popen(["myproc"], stderr=STDOUT, stdout=PIPE)
Nun, wenn ich
line = p.stdout.readline()
mein Programm tun wartet, bis die subprocess die nächste Zeile ausgibt.
Gibt es irgendeine Magie, die ich zu p.stdout
tun kann, so dass ich die Ausgabe lesen könnte, wenn es da ist, aber nur sonst fortfahren? Ich suche etwas wie Queue.get_nowait()
Ich weiß, ich kann nur einen Thread zum Lesen p.stdout
erstellen, aber nehmen wir an, ich kann keine neuen Threads erstellen.
+1 Ich mag diese Lösung –
Was genau zurückgegeben wird? Dies gibt noch keine Ahnung, wie viele Bytes es zu lesen gibt. – iElectric
'select' gibt den Satz von Dateideskriptoren (unter denen Sie ihn übergeben haben) zurück, auf denen I/O ohne Blockierung ausgeführt werden kann. Wenn Sie dafür sorgen können, dass p.stdout nach der Tatsache auf "non-blocking" gesetzt wird (systemabhängig), können Sie einfach p.stdout.read (N) für einige große N posten und alle Bytes erhalten, die tatsächlich verfügbar sind. Wenn die nicht blockierende Option nicht verfügbar ist, können Sie nur 1 Byte gleichzeitig lesen und dann zu 'select' zurückkehren, bis Ihnen mitgeteilt wird, dass es keine weiteren gibt. Achten Sie darauf, die Bytes, die Sie gelesen haben, in eine Liste einzufügen und am Ende zu verbinden (viel schneller als + = 'weg auf Strings! -). –