Python子进程捕获stdout竞争条件

时间:2016-04-05 23:53:31

标签: python multithreading pipe subprocess race-condition

使用POpen启动进程时我想捕获stderr和stdout管道。我的代码有效但在正在执行的进程和被包装的流之间存在竞争条件。当调度程序返回到Python程序时,这会在一些stdout流入控制台之前表现出来。

# 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

如何将流包装到subprocess.Popen之前?

1 个答案:

答案 0 :(得分:0)

  

这可以通过一些stdout在调度程序返回到Python程序时被包装之前流入控制台来实现。

没有种族。

在您的情况下,

stdout可以是PIPEDEVNULL。在{/ em> stdout执行之前(在分叉之后但在cmd_args被调用之前),exec()甚至被重定向。

如果你看到任何输出;这意味着cmd_argsstdoutstderr之外写入,即它可以直接写入终端。请参阅Q: Why not just use a pipe (popen())?

中的第一个原因

您可以使用ptypexpect)来捕获此类输出code example。可能有some issues if you want to provide multiple pseudo-ttys (to capture stdout/stderr separately)