python download - Debuggen einer pyQT4 App?





designer tutorial (3)


Ich musste einen "nächsten" Befehl am Verfolgungspunkt verwenden, um zuerst von dieser Funktion zu kommen. Dafür habe ich eine Modifikation des Codes von mgrandi vorgenommen:

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)

Das hat für mich funktioniert. Ich habe die Lösung von hier gefunden: Python (pdb) - Anstehende Befehle zum Ausführen

Ich habe eine ziemlich einfache App mit pyqt4 gebaut. Ich wollte eine der Funktionen debuggen, die mit einer der Tasten in meiner App verbunden sind. Wenn ich jedoch folgendes mache

python -m pdb app.pyw
> break app.pyw:55  # This is where the signal handling function starts.

Die Dinge funktionieren nicht so, wie ich es mir erhofft habe. Anstatt die Funktion, in der ich den Haltepunkt gesetzt habe, QCoreApplication::exec: The event loop is already running und QCoreApplication::exec: The event loop is already running , gibt der Debugger eine Endlosschleife ein, die QCoreApplication::exec: The event loop is already running und ich kann nichts QCoreApplication::exec: The event loop is already running . Gibt es einen besseren Weg, dies zu tun?




Sie müssen QtCore.pyqtRemoveInputHook . Ich verpacke es in meine eigene Version von 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()

Und wenn Sie mit dem Debuggen fertig sind, können Sie QtCore.pyqtRestoreInputHook() aufrufen, wahrscheinlich am besten, wenn Sie noch in pdb sind, und dann, nachdem Sie die Eingabetaste gedrückt haben und der Konsolenspam passiert, weiter 'c' (for continue) drücken App wird ordnungsgemäß fortgesetzt. (Ich musste aus irgendeinem Grund mehrmals 'c' drücken, es ging immer wieder in pdb, aber nachdem ich es einige Male getroffen hatte, ging es normal weiter)

Für weitere Informationen Google "pyqtRemoveInputHook pdb". (Wirklich offensichtlich ist es nicht?; P)




Die richtige, einfache, coole, exakte Antwort für die Frage ist die Verwendung von% run-Makro mit -d Flag.

In [4]: run -d myscript.py
NOTE: Enter 'c' at the ipdb>  prompt to continue execution.        
> /cygdrive/c/Users/mycodefolder/myscript.py(4)<module>()
      2                                                            
      3                        
----> 4 a=1                                            
      5 b=2




python qt pyqt4