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?

Author: Paul Wicks, 2009-11-15

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)

 73
Author: quark,
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
 2
Author: jamk,
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