使用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
之前?
答案 0 :(得分:0)
这可以通过一些stdout在调度程序返回到Python程序时被包装之前流入控制台来实现。
没有种族。
在您的情况下, stdout
可以是PIPE
或DEVNULL
。在{/ em> stdout
执行之前(在分叉之后但在cmd_args
被调用之前),exec()
甚至被重定向。
如果你看到任何输出;这意味着cmd_args
在stdout
,stderr
之外写入,即它可以直接写入终端。请参阅Q: Why not just use a pipe (popen())?
您可以使用pty
(pexpect
)来捕获此类输出code example。可能有some issues if you want to provide multiple pseudo-ttys (to capture stdout/stderr separately)。