如何在 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.QProcessreadyReadStandardErrorreadyReadStandardOutput 信号,它们在 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_()