Python 是否有方法轮询从subprocess.Popen返回的文件句柄?
假设我写下:Python 是否有方法轮询从subprocess.Popen返回的文件句柄?,python,pipe,subprocess,Python,Pipe,Subprocess,假设我写下: from subprocessing import Popen, STDOUT, PIPE p = Popen(["myproc"], stderr=STDOUT, stdout=PIPE) 现在如果我这样做了 line = p.stdout.readline() 我的程序等待子进程输出下一行 我能对p.stdout做些什么,这样我就可以读取输出,如果它在那里的话,但如果不在那里,就继续吧?我在找排队之类的东西 我知道我可以创建一个线程来读取p.stdout,但假设我不能创建新
from subprocessing import Popen, STDOUT, PIPE
p = Popen(["myproc"], stderr=STDOUT, stdout=PIPE)
现在如果我这样做了
line = p.stdout.readline()
我的程序等待子进程输出下一行
我能对p.stdout做些什么,这样我就可以读取输出,如果它在那里的话,但如果不在那里,就继续吧?我在找排队之类的东西
我知道我可以创建一个线程来读取p.stdout,但假设我不能创建新线程。使用p.stdout.read1这将逐字符读取
下面是一个完整的例子:
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()
使用Python标准库中的select模块,请参阅。select.select[p.stdout.fileno],[],[],0立即返回一个元组,其项为三个列表:如果该文件描述符上有要读取的内容,则第一个元组将不为空。返回的具体内容是什么?这仍然没有给出要读取多少字节的线索。select返回您传递给它的文件描述符集合,在这些文件描述符上可以执行I/O而无需阻塞。如果您可以在依赖于系统的事实发生后将p.stdout设置为非阻塞,那么您只需将p.stdout.readN设置为一些较大的N,并获取所有实际可用的字节;如果非阻塞选项不可用,您所能做的就是一次读取1个字节,然后返回选择,直到它告诉您没有更多字节。一定要把你读到的字节附加到一个列表中,并在末尾加入它,这比字符串上的+='ng要快得多。根据2.x中的文档,选择“不应在具有文件描述符的窗口上工作”。从子流程导入Popen、PIPE、STDOUT;p=Popen['python.exe'],stdout=PIPE,stderr=stdout,stdin=PIPE;selectp.stdout.fileno,,,0生成错误:10038,“尝试对非套接字的内容执行操作”,因为正如python文档所述,select.select是使用WinSock的select实现的,它只接受套接字,不接受文件描述符。谢谢!我不知道我见过多少问题要求对这个问题给出一个简单的答案——就是这样。我也试着一个字一个字地读,但我不知道如何检查这个过程是否已经完成……完全没有完成投票+1+1此解决方案可能适用于Windows,其中select不适用于子流程模块创建的文件描述符。注意:如果子进程在stderr上生成了足够的输出,那么它可能会阻塞,除非您从中读取操作将stderr重定向到stdout stderr=stdout,这样就不会发生这种情况。用于与“无”进行比较,例如,如果x不是“无”:。您可以使用if out:而不是if out!=:它同时适用于bytestring和Unicode字符串。另外,如果cmd在非交互模式下使用块缓冲,那么process.stdout在cmd刷新缓冲区之前不会得到任何东西。我认为这并不能回答所提出的问题。如果没有可用的输出,此方法将在read1处阻塞-所要求的方法在这种情况下不会阻塞,而是继续执行其他操作。@DonHatch您是对的,但它对我很有用