私は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
を出力する無限ループに入り、何も入力できません。これを行うためのより良い方法はありますか?
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)
最初にその関数の外に出るには、トレースポイントで「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)-実行するコマンドをキューに入れる
私のテストでは、jamkのソリューションは機能しますが、前のソリューションは単純ですが機能しません。
状況によっては、私にはわからない理由で、これを何もせずにQtをデバッグすることができました。