有没有办法轮询从subprocess.Popen返回的文件句柄?

时间:2009-05-19 14:33:15

标签: python pipe subprocess

说我写这个:

from subprocessing import Popen, STDOUT, PIPE
p = Popen(["myproc"], stderr=STDOUT, stdout=PIPE)

现在,如果我这样做

line = p.stdout.readline()

我的程序一直等到子进程输出下一行。

我可以对p.stdout做什么魔术,以便我可以读取输出,如果它在那里,但只是继续吗?我正在寻找像Queue.get_nowait()

这样的东西

我知道我可以创建一个用于阅读p.stdout的线程,但我们假设我无法创建新线程。

2 个答案:

答案 0 :(得分:8)

使用p.stdout.read(1)这将逐个字符地读取

这是一个完整的例子:

import subprocess
import sys

process = subprocess.Popen(
    cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE
)

while True:
    out = process.stdout.read(1)
    if out == '' and process.poll() != None:
        break
    if out != '':
        sys.stdout.write(out)
        sys.stdout.flush()

答案 1 :(得分:5)

使用Python标准库中的select模块,请参阅http://docs.python.org/library/select.htmlselect.select([p.stdout.fileno()], [], [], 0)会立即返回一个元组,其项目是三个列表:如果要在该文件描述符上读取内容,则第一个元素将变为非空。