首页 > 解决方案 > QPlainTextEdit:使用线程的子进程分段错误

问题描述

在 QPlainTextEdit 上显示时 subprocess.stdout 中的分段错误

嗨,我正在为所示函数启动一个线程,并将其结果流式传输到线程中的 QTextEdit 对象。该函数有时会因未知原因而因分段错误而崩溃。

self.plainTextEdit = QPlainTextEdit()
self.thread = Thread(target = runcmd, args = ("make dc",))
self.thread.start()
self.thread.join()
def runcmd(self,cmd):
    process = subprocess.Popen(shlex.split(cmd),stdout=subprocess.PIPE, bufsize=-1)
    while True:
        line = process.stdout.readline()
        if not line:
            break
        self.plainTextEdit.moveCursor(QTextCursor.End)
        self.plainTextEdit.insertPlainText(line.strip())
    process.terminate()

使直流

命令是对设计编译器综合工具的调用。如果我尝试打印

线

变量而不是写入 plainTextEdit 对象,线程运行良好,在终端窗口中显示结果。欢迎任何帮助/建议......谢谢

标签: pythonpyqtsegmentation-faultsubprocesspyside

解决方案


而不是使用subprocess.Popen()你应该使用QProcessGUI 友好的,因此没有必要使用新线程。

from PyQt5.QtCore import *
from PyQt5.QtWidgets import *

import shlex


class LogWidget(QWidget):
    def __init__(self, parent=None):
        super(LogWidget, self).__init__(parent)
        lay = QVBoxLayout(self)
        self.plainTextEdit = QPlainTextEdit()
        lay.addWidget(self.plainTextEdit)
        self.runcmd("make dc")

    def runcmd(self, cmd):
        process = QProcess(self)
        process.readyReadStandardOutput.connect(self.onReadyReadStandardOutput)
        process.readyReadStandardError.connect(self.onReadyReadStandardError)
        program, *arguments = shlex.split(cmd)
        process.start(program, arguments)

    def onReadyReadStandardOutput(self):
        process = self.sender()
        self.plainTextEdit.appendPlainText(str(process.readAllStandardOutput()))

    def onReadyReadStandardError(self):
        process = self.sender()
        self.plainTextEdit.appendPlainText(str(process.readAllStandardError()))


if __name__ == '__main__':
    import sys

    app = QApplication(sys.argv)
    w = LogWidget()
    w.show()
    sys.exit(app.exec_())

推荐阅读