2016-04-05 7 views
0

Wenn ich einen Prozess mit POpen starten möchte ich die Stderr und Stdout Pipes erfassen. Mein Code funktioniert, hat jedoch eine Racebedingung zwischen dem ausgeführten Prozess und dem umzufüllenden Stream. Dies manifestiert sich durch ein gewisses Ausbluten in die Konsole, bevor es umbrochen wird, wenn der Scheduler zum Python-Programm zurückkehrt.Python Subprozess Capture Stdout Race-Bedingung

# Start process. 
proc = subprocess.Popen(cmd_args, env=context, cwd=cwd, 
    stdout=subprocess.PIPE if capture_out else subprocess.DEVNULL, 
    stderr=subprocess.PIPE if capture_err else subprocess.DEVNULL, 
    stdin=None) 

# Wrap streams. 
out_stream = NonBlockingStreamReader(proc.stdout) if capture_out else None 
err_stream = NonBlockingStreamReader(proc.stderr) if capture_err else None 

Wie kann ich die Streams einbinden, bevor Sie sie an subprocess.Popen übergeben?

Antwort

0

Dies äußert sich durch eine stdout bluten in die Konsole vor, wenn der Scheduler kehrt zum Programm Python eingewickelt werden.

Es gibt kein Rennen.

stdout ist entweder PIPE oder DEVNULL in Ihrem Fall. stdout wird sogar umgeleitet, bevorcmd_args ausgeführt wird (nach der Verzweigung aber vor exec() heißt).

Wenn Sie überhaupt eine Ausgabe sehen; es bedeutet, dass cmd_args außerhalb von stdout, stderr schreibt, d.h. es kann direkt in das Terminal schreiben. Siehe den ersten Grund in Q: Why not just use a pipe (popen())?

Sie könnten pty (pexpect) verwenden, um einen solchen Ausgang zu erfassen, code example. Es könnte some issues if you want to provide multiple pseudo-ttys (to capture stdout/stderr separately) sein.

Verwandte Themen