繁体   English   中英

使用PyDev + Eclipse调试PyQt应用程序

[英]Debugging a PyQt application using PyDev+Eclipse

我通常在Eclipse中使用PyDev进行Python开发。 但是,我是在同一环境中第一次尝试PyQt。 它运作良好,但有一个例外。 如果程序在Qt主事件循环内的任何地方(包括我自己的代码内)出错,则没有错误信息输出到PyDev控制台。

为了证明这一点,我创建了以下简单的PyQt应用程序:

import sys
from PyQt5 import uic
from PyQt5.QtWidgets import QApplication

# test.ui contains a single Push Button named pushButton
base, form = uic.loadUiType("../ui/test.ui") 

class MainWindow(base, form):
    def __init__(self, parent=None):
        super(base, self).__init__(parent)
        self.setupUi(self)
        self.pushButton.clicked.connect(self.button_pressed)

    def button_pressed(self):
        print('button pressed')
        print(invalid_variable) # intentional error
        pass

if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.setStyle("fusion")
    main_window = MainWindow()
    main_window.show()
    sys.exit(app.exec_())

如果在if __name__ == '__main__':之后的任何地方if __name__ == '__main__': app.exec_()命令之前的任何地方放置了诸如print(invalid_variable)之类的故意错误,则程序将正确地终止于回溯,并且预期的NameError: name 'invalid_variable' is not defined 但是,如果我按在使用上面的代码我对话框中的按钮, button pressed控制台上显示,但随后在应用程序终止默默在控制台没有错误信息。 其他调试操作(例如断点和表达式)也可以正常工作。

这是预期的行为吗? 如果是这样,您建议如何在此环境中调试PyQt应用程序。 如果不是这样,我将不胜感激,了解我需要采取哪些措施来纠正此问题。

  • python版本:python-3.4.3.amd64
  • PyDev版本:适用于Eclipse 4.3.0.201508182223的PyDev
  • PyQt版本:PyQt5-5.5-gpl-Py3.4-Qt5.5.0-x64

更新2015-09-30

当我直接使用python.exe运行测试应用程序时,在两种错误情况下,它都会将错误正确输出到stderr 因此,此问题似乎确实是PyDev环境所特有的。 我还创建了一个完全新鲜的Eclipse工作区,仅配置了Python解释器,并使用相同的源代码在新创建的PyDev项目上再次运行了测试。 结果是相同的。

这是一个非常古老的问题,但我认为我会提供答案,因为它出现在Google搜索此问题上。

问题是对pyqt5.5 +处理错误的更改,包括以下代码将在崩溃时重新启用stacktrace。

它在互联网上进行了大量随机浏览,但最终找到了解决该问题所需的代码,在此发布以供遇到相同问题的其他人参考。 当我终于找到它时很明显。 ;)

from PyQt5 import QtCore
import traceback, sys


if QtCore.QT_VERSION >= 0x50501:
    def excepthook(type_, value, traceback_):
        traceback.print_exception(type_, value, traceback_)
        QtCore.qFatal('')
sys.excepthook = excepthook

希望这对其他人有帮助。

我有同样的问题。 我只添加了一行:

import ipdb

因此,我所有的QT应用程序都向我显示错误。 ipdb-这是用于调试脚本的模块,但无需任何设置(仅导入),即可根据需要工作

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM