TLDR: steckte mit dieser https://code.google.com/archive/p/byte-unixbench/issues/1Subproces.popen - Slave-Schreibvorgang fehlgeschlagen: Defekte Pipe; Abbruch
Versuch UnixBench mit subprocess.popen()
während der Aufnahme Ausgabe und Drucken Sie es aus in Echtzeit ausgeführt werden.
Dies ist das Unterprogramm I habe kommen mit:
def run_and_print(command, cwd=None, catch_stderr = False):
if catch_stderr:
err_pipe = subprocess.PIPE
else:
err_pipe = subprocess.STDOUT
p = subprocess.Popen(command, stdout=subprocess.PIPE, bufsize=1, cwd=cwd, stderr=err_pipe)
r = ''
while True:
if catch_stderr:
out = p.stderr.read(1)
else:
out = p.stdout.read(1)
if out == "" and p.poll() != None:
break
sys.stdout.write(out)
sys.stdout.flush()
r += out
return r
Es funktioniert gut für alle Zwecke mit Ausnahme UnixBench. Unixbench stirbt nur nach einer Weile:
unixbench = run_and_print(['./Run'])
...
1 x Rohrdurchsatz 1 2 3 4 5 6 7 8 9 10
1 x Rohrbasierte Kontextumschaltung 1 2 3 4
Run: "Pipe basierte Kontextumschaltung": Slave schreiben versagt: Unterbrochenes Rohr; abbrechen
Google hat nicht viel geholfen. Das einzige aussagekräftige Ergebnis, das ich habe, ist https://code.google.com/archive/p/byte-unixbench/issues/1 und ich schlage vor, dass die Lösung zum Erstellen einer Java-App für mich nicht funktioniert, da ich das Skript mit so wenigen Abhängigkeiten wie möglich ausführen muss.
Ich werde für jede Lösung oder eine Problemumgehung dankbar sein. Das System, das ich auf die Prüfung dieses bin ist Ubuntu 14.04.4 x64
Wahrscheinlich wird nicht helfen, aber haben Sie versucht, 'p.communicate()'?Ein möglicher Hack: Versuchen Sie nicht, die Ausgabe in Python zu erfassen; Führen Sie stattdessen den Befehl aus, indem Sie stderr und stdout in verschiedene Textdateien umleiten. Dann lies diese Dateien über Python. – FMc
@FMc Gute Idee über das Schreiben in Dateien, nicht sicher, wie stdout in Echtzeit drucken, wenn es in eine Datei umgeleitet wird. Wie empfehlen Sie die Verwendung von p.communicate()? Es war mein Verständnis, dass ich mit "kommunizieren" keine Ausgabe erhalten werde, bis der Prozess abgeschlossen ist. Danke für die Antwort. – Anton
@ user1556912, Ihr Verständnis ist richtig, Sie können nicht kommunizieren, wenn Sie die Ausgabe sofort wollen. –