Отладка приложения pyQT4?
У меня довольно простое приложение, построенное с помощью 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
, и я не могу ничего ввести. Есть ли лучший способ сделать это?
Ответы
Ответ 1
Вам нужно позвонить 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)
Ответ 2
Мне пришлось использовать "следующую" команду в точке трассировки, чтобы сначала выйти за пределы этой функции. Для этого я сделал модификацию кода из 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) - Выполнение команд для очереди