仅当 QProcess Stdout 包含子字符串时才打印它
Posted
技术标签:
【中文标题】仅当 QProcess Stdout 包含子字符串时才打印它【英文标题】:Printing QProcess Stdout only if it contains a Substring 【发布时间】:2017-07-13 17:52:04 【问题描述】:PyQt4 应用程序在 QProcess
中运行 ping
。一个名为 self.output
的 QTextEdit
将输出来自 ping
的所有内容。第二个名为self.summary
的QTextEdit
将仅输出包含字符串TTL
的行。
问题:我设法让self.output
工作,但不是self.summary
,因为我不确定如何在dataReady
函数中编写它的代码。有什么想法吗?
import sys
from PyQt4 import QtGui, QtCore
class MainWindow(QtGui.QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.initUI()
def dataReady(self):
cursorOutput = self.output.textCursor()
cursorSummary = self.summary.textCursor()
cursorOutput.movePosition(cursorOutput.End)
cursorSummary.movePosition(cursorSummary.End)
processStdout = str(self.process.readAll())
# Update self.output
cursorOutput.insertText(processStdout)
# Update self.summary
for line in processStdout:
if 'TTL' in line:
cursorSummary.insertText(line)
self.output.ensureCursorVisible()
self.summary.ensureCursorVisible()
def callProgram(self):
self.process.start('ping', ['127.0.0.1'])
def initUI(self):
layout = QtGui.QHBoxLayout()
self.runBtn = QtGui.QPushButton('Run')
self.runBtn.clicked.connect(self.callProgram)
self.output = QtGui.QTextEdit()
self.summary = QtGui.QTextEdit()
layout.addWidget(self.runBtn)
layout.addWidget(self.output)
layout.addWidget(self.summary)
centralWidget = QtGui.QWidget()
centralWidget.setLayout(layout)
self.setCentralWidget(centralWidget)
# QProcess object for external app
self.process = QtCore.QProcess(self)
self.process.readyRead.connect(self.dataReady)
self.process.started.connect(lambda: self.runBtn.setEnabled(False))
self.process.finished.connect(lambda: self.runBtn.setEnabled(True))
def main():
app = QtGui.QApplication(sys.argv)
mainWindow = MainWindow()
mainWindow.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
【问题讨论】:
【参考方案1】:您可能遇到的一个问题是QProcess
的每个输出可能有几行,即包含"\n"
,为了没有这个问题我们将它分开,然后我们进行搜索:
for line in processStdout.split("\n"):
if "TTL" in line:
cursorSummary.insertText(line+"\n")
在您的初始代码中,您使用 for 循环获取每个字符,这会产生错误。
注意: 在 linux 中,我必须按单词 ttl
进行过滤。除了将 QProcess 更改为:self.process.start('ping', ['-c', '3', '127.0.0.1'])
【讨论】:
以上是关于仅当 QProcess Stdout 包含子字符串时才打印它的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Windows 上通过 QProcess 启动提升的子进程?