栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

实时发出拦截子流程输出的信息

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

实时发出拦截子流程输出的信息

这里的问题是

process.stdout.readline()
将阻塞直到有完整的行可用为止。这意味着
line ==''
直到流程退出,该条件才被满足。您有两种选择。

首先,您可以将stdout设置为非阻塞并自己管理缓冲区。它看起来像这样。编辑:正如Terry Jan
Reedy指出的那样,这是仅Unix的解决方案。第二种选择应该是首选。

import fcntl...    def startProcess(self):        self.process = subprocess.Popen(['./subtest.sh'], stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE, bufsize=0) # prevent any unnecessary buffering        # set stdout to non-blocking        fd = self.process.stdout.fileno()        fl = fcntl.fcntl(fd, fcntl.F_GETFL)        fcntl.fcntl(fd, fcntl.F_SETFL, fl | os.O_NONBLOCK)        # schedule updatelines        self.after(100, self.updateLines)    def updateLines(self):        # read stdout as much as we can        line = ''        while True: buff = self.process.stdout.read(1024) if buff:     buff += line.depre() else:     break        self.console.config(state=tkinter.NORMAL)        self.console.insert(tkinter.END, line)        self.console.config(state=tkinter.DISABLED)        # schedule callback        if self.process.poll() is None: self.after(100, self.updateLines)

第二种选择是让一个单独的线程将行读入队列。然后从队列中弹出更新行。看起来像这样

from threading import Threadfrom queue import Queue, Emptydef readlines(process, queue):    while process.poll() is None:        queue.put(process.stdout.readline())...    def startProcess(self):        self.process = subprocess.Popen(['./subtest.sh'], stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE)        self.queue = Queue()        self.thread = Thread(target=readlines, args=(self.process, self.queue))        self.thread.start()        self.after(100, self.updateLines)    def updateLines(self):        try: line = self.queue.get(False) # False for non-blocking, raises Empty if empty self.console.config(state=tkinter.NORMAL) self.console.insert(tkinter.END, line) self.console.config(state=tkinter.DISABLED)        except Empty: pass        if self.process.poll() is None: self.after(100, self.updateLines)

穿线路线可能更安全。我不太肯定将stdout设置为non-blocking可以在所有平台上使用。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/645278.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号