如何在 GUI 中实时获取 exe 标准输出,尽管 cmd 在 Python 中执行?
How to get exe stdout in real time in GUI though cmd is executing in Python?
with Popen([cmd command], stdout=PIPE, bufsize=1,
universal_newlines=True) as p:
for line in p.stdout:
log.insertPlainText(line)
我想通过Python代码运行exe文件,实时从pyqt获取打印内容。所以我写了上面的代码。但是cmd打印的结果全部执行完后,exe内容一下子打印出来了。我想在 GUI 中实时接收它,即使 cmd 仍在工作,而不是在执行 cmd 的所有内容后将其输出到 pyqt。我想要一个参数值或其他方法来解决这个问题。
QtCore.QProcess
有 readyReadStandardError
和 readyReadStandardOutput
信号,它们在 stdout 和 stderr 上发出一次数据 ready
from PyQt5 import QtWidgets, QtCore, QtGui
from PyQt5.QtCore import Qt
def buffer_to_str(buf):
codec = QtCore.QTextCodec.codecForName("UTF-8")
return str(codec.toUnicode(buf))
class Process(QtCore.QObject):
stdout = QtCore.pyqtSignal(str)
stderr = QtCore.pyqtSignal(str)
finished = QtCore.pyqtSignal(int)
def start(self, program, args):
process = QtCore.QProcess()
process.setProgram(program)
process.setArguments(args)
process.readyReadStandardError.connect(lambda: self.stderr.emit(buffer_to_str(process.readAllStandardError())))
process.readyReadStandardOutput.connect(lambda: self.stderr.emit(buffer_to_str(process.readAllStandardOutput())))
process.finished.connect(self.finished)
process.start()
self._process = process
if __name__ == "__main__":
app = QtWidgets.QApplication([])
process = Process()
log = QtWidgets.QPlainTextEdit()
log.show()
process.stderr.connect(log.appendPlainText)
cmd = "ping"
args = ["google.com"]
process.start(cmd, args)
app.exec_()
with Popen([cmd command], stdout=PIPE, bufsize=1,
universal_newlines=True) as p:
for line in p.stdout:
log.insertPlainText(line)
我想通过Python代码运行exe文件,实时从pyqt获取打印内容。所以我写了上面的代码。但是cmd打印的结果全部执行完后,exe内容一下子打印出来了。我想在 GUI 中实时接收它,即使 cmd 仍在工作,而不是在执行 cmd 的所有内容后将其输出到 pyqt。我想要一个参数值或其他方法来解决这个问题。
QtCore.QProcess
有 readyReadStandardError
和 readyReadStandardOutput
信号,它们在 stdout 和 stderr 上发出一次数据 ready
from PyQt5 import QtWidgets, QtCore, QtGui
from PyQt5.QtCore import Qt
def buffer_to_str(buf):
codec = QtCore.QTextCodec.codecForName("UTF-8")
return str(codec.toUnicode(buf))
class Process(QtCore.QObject):
stdout = QtCore.pyqtSignal(str)
stderr = QtCore.pyqtSignal(str)
finished = QtCore.pyqtSignal(int)
def start(self, program, args):
process = QtCore.QProcess()
process.setProgram(program)
process.setArguments(args)
process.readyReadStandardError.connect(lambda: self.stderr.emit(buffer_to_str(process.readAllStandardError())))
process.readyReadStandardOutput.connect(lambda: self.stderr.emit(buffer_to_str(process.readAllStandardOutput())))
process.finished.connect(self.finished)
process.start()
self._process = process
if __name__ == "__main__":
app = QtWidgets.QApplication([])
process = Process()
log = QtWidgets.QPlainTextEdit()
log.show()
process.stderr.connect(log.appendPlainText)
cmd = "ping"
args = ["google.com"]
process.start(cmd, args)
app.exec_()