逐行读取子进程中的stdout和stderr,每行没有一个select()

时间:2015-01-14 15:01:53

标签: python pipe subprocess

我想在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()的东西会检查缓冲区大小或类似的东西。

0 个答案:

没有答案