47

私は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何も入力できなくなります。これを行うためのより良い方法はありますか?

4

3 に答える 3

90

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)

于 2009-11-17T01:03:06.877 に答える
5

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

于 2014-03-18T16:32:06.973 に答える
0

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

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

于 2020-03-26T20:56:30.507 に答える