2009-11-14 20 views
34

Tengo una aplicación bastante simple construida con pyqt4. Quería depurar una de las funciones conectadas a uno de los botones en mi aplicación. Sin embargo, cuando hago lo siguienteDepuración de una aplicación pyQT4?

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

cosas no funcionan del todo como esperaba. En lugar de interrumpir la función en la que establecí el punto de interrupción y dejarme pasar, el depurador ingresa en un bucle infinito imprimiendo QCoreApplication::exec: The event loop is already running y no puedo ingresar nada. ¿Hay una mejor manera de hacer esto?

+0

Solo para saber, ¿qué hay en la línea 55? ¿Es donde registra la señal o es la función que la maneja? –

+0

En este caso, esa es la función que maneja la señal. –

+1

Creo que esta no es una respuesta completa, pero podría probar ERIC como un GUI-Debugger para Python y PyQt: http://eric-ide.python-projects.org/ – Berschi

Respuesta

69

Debe llamar al QtCore.pyqtRemoveInputHook. Me envuelvo en mi propia versión de 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() 

Y cuando haya terminado la depuración, puede llamar a QtCore.pyqtRestoreInputHook(), probablemente mejor cuando usted todavía está en AP, y luego, después de llegar a entrar, y el correo no deseado consola está pasando, sigue presionando 'c' (para continuar) hasta que la aplicación se reanude correctamente. (Tuve que presionar 'c' varias veces por alguna razón, siguió volviendo a pdb, pero después de golpearlo unas cuantas veces se reanudó normalmente)

Para obtener más información, "pyqtRemoveInputHook pdb". (Realmente obvio ¿no?; P)

+3

Respuesta útil, solo como referencia, encontré que este funcionó con PyQt4, pero no con PySide. –

1

Tuve que usar un comando "siguiente" en el punto de rastreo para salir primero de esa función. Para eso hice una modificación del código de 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) 

Esto funcionó para mí. Encontré la solución desde aquí: Python (pdb) - Queueing up commands to execute

Cuestiones relacionadas