从 stdout 实时输出到 wx.TextArea

Live output to wx.TextArea from stdout

我有代码将 adb logcat 的输出打印到 wx.TextArea 框中,这一切都很好,单击按钮并 logcat 打印出来,它打印出更多当点击 phone 次并且一切正常时。 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 | 完成的。找到 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(文件结束)或其他信号(即关闭管道),但它的 stdin 一直处于打开状态等待新数据从第一个过程..

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