2016-04-29 2 views
1

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.

Antwort

1

Eine einfache Möglichkeit wäre, alle Kinder in temporäre Dateien schreiben zu lassen (https://docs.python.org/2/library/tempfile.html). Schreiben Sie einfach dort statt in eine Pipe und lesen Sie die Dateien nur bei Bedarf (bei einem Absturz).