python - 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 对象,线程运行良好,在终端窗口中显示结果。欢迎任何帮助/建议......谢谢
解决方案
而不是使用subprocess.Popen()
你应该使用QProcess
GUI 友好的,因此没有必要使用新线程。
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_())
推荐阅读
- javascript - 为什么嵌套函数不继承这个?
- javascript - 测试字符串是否为html的最佳方法
- r - 通过分治策略使用“read.csv”读取巨大的 csv 文件?
- python-3.x - sqlite select语句中的Python函数,这可能吗?
- c++ - 您究竟如何通过函数的参数传递数组?
- php - 将两个表的结果组合成 JSON
- android - 无法解析 ':app@debug/compileClasspath' 的依赖关系:无法解析 com.google.firebase:firebase-analytics-impl:[16.1.1]
- php - 当用户上传内容时,您将如何生成全新的 html 文件?
- java - 确定正确的 Spring Boot 启动器
- reactjs - 有条件地渲染 Font Awesome 图标