我的代码会将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'reterstr'函数完成的,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'))
底层代码(过滤应用名称的代码)如何停止打印实时日志,但顶部不是?我猜它与一个命令到另一个命令的管道有关。
答案 0 :(得分:0)
您可以使用Python过滤行:
if pkgName in line:
BTW:它可能是两个进程的问题,因为可能第二个等待EOF(文件结束)或其他信号(即封闭管道),但它的stdin
始终打开,等待来自第一个的新数据过程..
请检查:python-subprocess-interaction-why-does-my-process-work-with-popen-communicate