从标准输出实时输出到 wx.TextArea

Posted

技术标签:

【中文标题】从标准输出实时输出到 wx.TextArea【英文标题】:Live output to wx.TextArea from stdout 【发布时间】:2016-10-20 08:49:37 【问题描述】:

我有将 adb logcat 的输出打印到 wx.TextArea 框中的代码,这一切都很好,单击按钮并打印出 logcat,当手机点击时它会打印出更多并且一切正常。 toolsDir 和 pkgName 都是字符串。

        params = [toolsDir + "\\adb.exe", "logcat"]
        p = Popen(params, stdout=subprocess.PIPE, bufsize=1)
        for line in p.stdout:
            self.progressBox.AppendText(line.decode('utf-8'))

但是,我已将此代码修改为仅打印特定应用程序的日志,这是使用 Windows 的“findstr”函数 adb logcat | 完成的。 findstr myApp。下面的代码最初可以工作,但随后停止,并且不显示任何其他内容,无论发生什么,点击按钮,应用程序关闭等。 就像缓冲区已经到了尽头,不再处理任何进一步的事件。

        args = [toolsDir + '\\adb.exe', 'logcat']
        args2 = ['findstr', pkgName]
        process_adb = subprocess.Popen(args, stdout=subprocess.PIPE, shell=False)
        process_fs = subprocess.Popen(args2, stdin=process_adb.stdout, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=False)
        for line in process_fs.stdout:
            self.progressBox.AppendText(line.decode('utf-8'))

为什么底部代码(过滤应用名称的代码)会停止打印实时日志,而顶部却没有?我猜它与一个命令到另一个命令的管道有关。

【问题讨论】:

不能用 Python 过滤吗? if pkgName in line: 可能第二个进程等待 EOF(文件结束)。检查这个:***.com/questions/9674511/… 总是最简单的事情,行之有效,没想到那样做!哦时刻。如果你把你的答案作为答案,我会接受。 【参考方案1】:

您可以使用 Python 来过滤行:

if pkgName in line:

顺便说一句:这可能是两个进程的问题,因为可能第二个等待 EOF(文件结束)或其他信号(即关闭的管道),但它的 stdin 一直处于打开状态,等待来自第一个进程的新数据。 .

检查这个:python-subprocess-interaction-why-does-my-process-work-with-popen-communicate

【讨论】:

以上是关于从标准输出实时输出到 wx.TextArea的主要内容,如果未能解决你的问题,请参考以下文章

实时解码 - 标准输入到标准输出

Linux用户

从子进程读取的实时标准输出仅在从 PyCharm 而不是终端运行时才有效

logging模块

关于标准输入,标准输出,标准错误

logger模块