QWebEngineView无错误输出崩溃求助:未改代码突发故障
问题:PyQt5 WebEngine 程序无征兆冻结崩溃(Segmentation Fault)
页面加载完成后,在搜索框输入内容时程序完全冻结,点击部分链接后直接冻结崩溃,无任何错误提示。此前代码可正常运行,未修改代码的情况下突发故障。已检查驱动、重装PyQt,问题仍未解决。
环境:Windows 10、Python 3.9.7,崩溃时MinGW提示Segmentation fault。
代码示例:
from PyQt5.QtCore import * from PyQt5.QtWidgets import * from PyQt5.QtWebEngineWidgets import * class TabWidget(QTabWidget): def __init__(self, *args, **kwargs): QTabWidget.__init__(self, *args, **kwargs) url = QUrl("https://google.com") view = HtmlView(self) view.load(url) ix = self.addTab(view, "loading ...") class HtmlView(QWebEngineView): def __init__(self, *args, **kwargs): QWebEngineView.__init__(self, *args, **kwargs) self.tab = self.parent() def createWindow(self, windowType): if windowType == QWebEnginePage.WebBrowserTab: webView = HtmlView(self.tab) ix = self.tab.addTab(webView, "loading ...") self.tab.setCurrentIndex(ix) return webView return QWebEngineView.createWindow(self, windowType) if __name__ == "__main__": import sys app = QApplication(sys.argv) main = TabWidget() main.show() sys.exit(app.exec_())
解决方法
禁用Qt WebEngine沙箱:Windows环境下,WebEngine的沙箱机制易触发段错误,启动时添加
--no-sandbox参数:if __name__ == "__main__": import sys sys.argv.append("--no-sandbox") app = QApplication(sys.argv) main = TabWidget() main.show() sys.exit(app.exec_())锁定兼容的PyQt版本:Python 3.9.7适配PyQt5 5.15.x系列,卸载现有版本后重装指定版本:
pip uninstall pyqt5 pyqtwebengine pip install pyqt5==5.15.6 pyqtwebengine==5.15.6重置WebEngine缓存:缓存损坏会引发运行异常,可自定义缓存路径并清理旧缓存:
from PyQt5.QtWebEngineWidgets import QWebEngineProfile import os if __name__ == "__main__": import sys cache_dir = os.path.join(os.path.expanduser("~"), "CustomWebCache") os.makedirs(cache_dir, exist_ok=True) QWebEngineProfile.defaultProfile().setCachePath(cache_dir) sys.argv.append("--no-sandbox") # 可结合沙箱禁用 app = QApplication(sys.argv) main = TabWidget() main.show() sys.exit(app.exec_())更新Windows系统:系统补丁缺失可能导致底层运行库异常,确保Windows 10已安装最新更新包。
内容的提问来源于stack exchange,提问作者Dmitrii Gavrilov
相关产品推荐
相关产品推荐

