我想在Python中启动一个子进程并实时输出子进程的stdout和stderr。由于讨论here read()
的阻塞性质,使用两个或更多个管道可能会变得困难。
如this所示,这是可能的,但是:
FDs = [process.stdout.fileno(),
process.stderr.fileno()]
while True:
ret = select.select(FDs, [], [])
for fd in ret[0]:
if fd == process.stdout.fileno():
print(process.stdout.readline())
if fd == process.stderr.fileno():
print(process.stderr.readline())
如果不是select()
那么该死的话,这就是几乎我正在寻找的东西。与没有select()的读取(在进程终止后)相比,输出速度减慢了50倍或更多(在find
上测试)。
如果我尝试使用select()但总是读取整个缓冲区,例如通过使用readlines()
我遇到阻塞读取和读取一个管道的第一个问题将避免读取另一个。
我可以为每个管道启动一个读取器线程,但这会很丑陋和复杂,因为我必须确保线程正确终止。
所以我的问题是:你知道一种优雅的方式来读取同一个线程中的多个管道吗?也许有类似read_available_lines()
的东西会检查缓冲区大小或类似的东西。