我有一个使用pyqt4构建的相当简单的应用。我想调试连接到应用程序中按钮之一的功能。但是,当我执行以下操作时
python -m pdb app.pyw
> break app.pyw:55 # This is where the signal handling function starts.
事情并非如我所愿。调试器没有进入设置断点的功能并让我逐步执行它,而是进入了打印QCoreApplication::exec: The event loop is already running
的无限循环,而我无法输入任何内容。有更好的方法吗?
您需要呼叫QtCore.pyqtRemoveInputHook。我将其包装在自己的set_trace
版本中:
def debug_trace():
'''Set a tracepoint in the Python debugger that works with Qt'''
from PyQt4.QtCore import pyqtRemoveInputHook
# Or for Qt5
#from PyQt5.QtCore import pyqtRemoveInputHook
from pdb import set_trace
pyqtRemoveInputHook()
set_trace()
并且当您完成调试后,可以调用QtCore.pyqtRestoreInputHook()
,这可能最好,当您仍然在pdb中时,然后按Enter键,并且控制台垃圾邮件正在发生时,请继续按'c'(以继续),直到应用正确恢复。 (由于某种原因,我不得不多次击打'c',它一直返回到pdb中,但是击中几次之后,它又恢复了正常运行)
有关详细信息,请使用Google“ pyqtRemoveInputHook pdb”。 (真的很明显吗?; P)
我必须在跟踪点使用“ next”命令才能首先退出该函数。为此,我对mgrandi中的代码进行了修改:
def pyqt_set_trace():
'''Set a tracepoint in the Python debugger that works with Qt'''
from PyQt4.QtCore import pyqtRemoveInputHook
import pdb
import sys
pyqtRemoveInputHook()
# set up the debugger
debugger = pdb.Pdb()
debugger.reset()
# custom next to get outside of function scope
debugger.do_next(None) # run the next command
users_frame = sys._getframe().f_back # frame where the user invoked `pyqt_set_trace()`
debugger.interaction(users_frame, None)
这对我有用。我从这里找到了解决方案:Python (pdb) - Queueing up commands to execute
在我的测试中,jamk的解决方案有效,而前一个解决方案虽然简单,却没有。
在某些情况下,由于我不清楚的原因,我能够在不执行任何上述操作的情况下调试Qt。