Python子进程捕获标准输出竞争条件

Python子进程捕获标准输出竞争条件,python,multithreading,pipe,subprocess,race-condition,Python,Multithreading,Pipe,Subprocess,Race Condition,在使用POpen启动进程时,我希望捕获stderr和stdout管道。我的代码可以工作,但在正在执行的进程和正在包装的流之间有一个竞争条件。当调度程序返回到Python程序时,在包装之前,通过一些标准输出将其自身显示到控制台中 # Start process. proc = subprocess.Popen(cmd_args, env=context, cwd=cwd, stdout=subprocess.PIPE if capture_out else subprocess.DEVNU

在使用POpen启动进程时,我希望捕获stderr和stdout管道。我的代码可以工作,但在正在执行的进程和正在包装的流之间有一个竞争条件。当调度程序返回到Python程序时,在包装之前,通过一些标准输出将其自身显示到控制台中

# 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
之前,如何包装流

当调度程序返回到Python程序时,在包装之前,通过一些标准输出将其自身显示到控制台中

# 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
没有种族

stdout
在您的情况下是
PIPE
DEVNULL
stdout
甚至在执行
cmd_args
之前(在fork之后,但在调用
exec()
之前)被重定向

如果你看到任何输出;这意味着
cmd_args
stdout
stderr
之外写入,即可以直接写入终端。请参阅中的第一个原因

您可以使用
pty
pexpect
)来捕获这样的输出。可能有

当调度程序返回到Python程序时,在包装之前,通过一些标准输出将其自身显示到控制台中

# 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
没有种族

stdout
在您的情况下是
PIPE
DEVNULL
stdout
甚至在执行
cmd_args
之前(在fork之后,但在调用
exec()
之前)被重定向

如果你看到任何输出;这意味着
cmd_args
stdout
stderr
之外写入,即可以直接写入终端。请参阅中的第一个原因

您可以使用
pty
pexpect
)来捕获这样的输出。可能有