Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否有方法轮询从subprocess.Popen返回的文件句柄?_Python_Pipe_Subprocess - Fatal编程技术网

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您是对的,但它对我很有用