Debugowanie aplikacji pyQT4?
Mam dość prostą aplikację zbudowaną z pyqt4. Chciałem debugować jedną z funkcji podłączonych do jednego z przycisków w mojej aplikacji. Jednak, gdy wykonuję następujące
python -m pdb app.pyw
> break app.pyw:55 # This is where the signal handling function starts.
Rzeczy nie działają tak, jak mam nadzieję. Zamiast włamać się do funkcji, w której ustawiłem punkt przerwania i pozwolić mi przejść przez nią, debugger wchodzi w nieskończoną pętlę drukującą QCoreApplication::exec: The event loop is already running
i nie jestem w stanie niczego wprowadzić. Jest na to lepszy sposób?
2 answers
Musisz zadzwonić do QtCore.pyqtRemoveInputHook . Zawijam go we własną wersję 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()
A kiedy skończysz debugowanie, możesz zadzwonić QtCore.pyqtRestoreInputHook()
, prawdopodobnie najlepiej, gdy nadal jesteś w pdb, a następnie po naciśnięciu enter, a konsola spam się dzieje, wciśnij " C " (dla continue), dopóki aplikacja nie zostanie poprawnie wznowiona. (Musiałem uderzyć " c " kilka razy z jakiegoś powodu, ciągle wracał do pdb, ale po uderzeniu kilka razy wznowił normalnie)
Do dalszych info Google "pyqtRemoveInputHook pdb". (Naprawdę oczywiste, prawda? ; P)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-07 22:01:51
Musiałem użyć polecenia "next" w punkcie śledzenia, aby najpierw wyjść poza tę funkcję. W tym celu dokonałem modyfikacji kodu z 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)
To mi pomogło. Znalazłem rozwiązanie stąd: Python (pdb) - kolejkowanie poleceń do wykonania Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:46:58