从标准输出实时输出到 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的主要内容,如果未能解决你的问题,请参考以下文章