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

its*_*dok 4 python subprocess pipe

说我写这个:

from subprocessing import Popen, STDOUT, PIPE
p = Popen(["myproc"], stderr=STDOUT, stdout=PIPE)
Run Code Online (Sandbox Code Playgroud)

现在,如果我这样做

line = p.stdout.readline()
Run Code Online (Sandbox Code Playgroud)

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

有没有什么魔法可以p.stdout让我可以读取输出,如果它在那里,但只是继续吗?我正在寻找类似的东西Queue.get_nowait()

我知道我可以创建一个读取线程p.stdout,但我们假设我无法创建新线程.

Nad*_*mli 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()
Run Code Online (Sandbox Code Playgroud)

  • 我不认为这回答了被问到的问题.如果没有可用的输出,这个方法在read(1)处阻塞 - 要求的是在这种情况下不阻塞的方法,而是继续做其他事情. (3认同)

Ale*_*lli 5

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

  • `select`返回一组文件描述符(在你传递它们的那些文件描述符中),可以在不阻塞的情况下执行I/O. 如果你可以安排p.stdout在事后(系统相关)被设置为非阻塞,你可以只为p.stdout.read(N)获得一些大的N并获得实际可用的所有字节; 如果nonblocking选项不可用,你所能做的就是一次读取1个字节并返回`select`ing,直到它告诉你不再有.一定要将你读到的字节追加到一个列表中,然后在最后添加.join(比字符串上的+ ='ng快得多! - ). (2认同)