Ich habe ein Skript, das lange Läufe eines anderen Programms, das manchmal parallel ausgeführt werden kann (d. H. Ich könnte die Funktion unten mehrmals aufrufen). Ich möchte über diese Kinder schießen und zu vergessen, so habe ich zur Zeit:Python Subprozess lesen stdout/stderr wenn das Programm in <10 Sekunden stürzt
p = subprocess.Popen(cmd, shell=False)
time.sleep(20)
result = p.poll()
if result is not None and result != 0:
print("Child failed to start with exit code: {}".format(result))
return False
return True
Das funktioniert gut für den größten Teil, aber ich mochte die stdout/stderr für das Kind bekommen, aber nur in dem Fall, dass es nicht länger als 10 Sekunden laufen.
Von meinem Verständnis mit Popen(..., stdout=PIPE)
wird bedeuten, dass, wenn ich nur das Subprozessobjekt ignorieren, dann wird der Puffer gefüllt und der Kindprozess wird hängen.
Wie kann ich das beheben, so dass es nicht hängen wird. Ist es überhaupt möglich, PIPE für None irgendwie zu tauschen?
p = subprocess.Popen(cmd, shell=False, stdout=PIPE, stderr=PIPE)
time.sleep(20)
result = p.poll()
if result is not None and result != 0:
print("Child failed to start with exit code: {}".format(result))
stdout, stderr = p.communicate()
print("STDOUT:", stdout)
print("STDERR:", stderr)
return False
return True
Es ist auch sicher davon ausgehen, dass ich leicht die Ausgabe halten kann, die in den ersten 10 Sekunden im Puffer erzeugt werden würden.