我有一个使用pyqt4构建的相当简单的应用程序.我想调试连接到我的应用程序中的一个按钮的其中一个功能.但是,当我做以下事情时
python -m pdb app.pyw
> break app.pyw:55 # This is where the signal handling function starts.
Run Code Online (Sandbox Code Playgroud)
事情并不像我希望的那样有效.而不是打破我设置断点并让我单步执行的函数,调试器进入无限循环打印输出QCoreApplication::exec: The event loop is already running,我无法输入任何内容.有一个更好的方法吗?
qua*_*ark 83
您需要调用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()
Run Code Online (Sandbox Code Playgroud)
当你完成调试时,你可以打电话QtCore.pyqtRestoreInputHook(),最好是当你还在pdb中,然后在你输入后,控制台垃圾邮件正在发生,继续点击"c"(继续),直到应用程序恢复正常.(由于某些原因,我不得不多次点击'c',它一直回到pdb,但是在击中它几次后它恢复正常)
有关详细信息,请访问Google"pyqtRemoveInputHook pdb".(真的很明显不是吗?; P)
我必须在跟踪点使用“下一个”命令才能首先退出该函数。为此,我对 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)
Run Code Online (Sandbox Code Playgroud)
这对我有用。我从这里找到了解决方案:Python (pdb) -排队要执行的命令