2009-11-14 10 views
34

私はpyqt4で構築されたかなりシンプルなアプリを持っています。私は自分のアプリケーションのボタンの1つに接続されている関数の1つをデバッグしたかったのです。しかし、私が次のことをすると、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を出力し、何も入力することができません。これを行うより良い方法はありますか?

+0

55行目には何がありますか?シグナルを登録する場所か、それを処理する関数ですか? –

+0

この場合、それは信号を処理する関数です。 –

+1

これは完全な答えではないと思いますが、PythonとPyQtのGUIデバッガとしてERICを試すことができます:http://eric-ide.python-projects.org/ – Berschi

答えて

69

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() 

をそして、あなたはデバッグを行っているとき、あなたはPDBに残っている、とあなたがヒットした後に入力して、コンソールのスパムがある、おそらく最高のとき、QtCore.pyqtRestoreInputHook()を呼び出すことができますアプリが正しく再開するまで「続ける」ために「c」を押し続けます。 (私はいくつかの理由で何回か 'c'を何回か打たなければならなかったが、pdbに戻ってきたが、数回打つと正常に再開した)

詳細については、Googleの "pyqtRemoveInputHook pdb"を参照してください。

+3

有用な答えです。 PyQt4では動作しましたが、PySideでは動作しませんでした。 –

1

トレースポイントで "next"コマンドを使用して、まずその関数の外に出なければなりませんでした。そのために、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) - Queueing up commands to execute