web-dev-qa-db-ja.com

pyQT4アプリをデバッグしますか?

私はpyqt4で構築されたかなりシンプルなアプリを持っています。アプリのボタンの1つに接続されている関数の1つをデバッグしたかったのです。しかし、私が次のことをするとき

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を出力する無限ループに入り、何も入力できません。これを行うためのより良い方法はありますか?

43
Paul Wicks

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

デバッグが完了したら、QtCore.pyqtRestoreInputHook()を呼び出すことができます。これは、まだpdbにいるときに最適です。次に、Enterキーを押してコンソールスパムが発生した後、「c」を押し続けます(続行する場合)。アプリが正常に再開するまで。 (何らかの理由で「c」を数回押す必要があり、pdbに戻り続けましたが、数回押すと正常に再開しました)

詳細については、Googleの「pyqtRemoveInputHookpdb」をご覧ください。 (本当に明らかではないですか?; P)

83
quark

最初にその関数の外に出るには、トレースポイントで「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)-実行するコマンドをキューに入れる

3
jamk

私のテストでは、jamkのソリューションは機能しますが、前のソリューションは単純ですが機能しません。

状況によっては、私にはわからない理由で、これを何もせずにQtをデバッグすることができました。

0