PythonコードにPDBブレークポイントを配置するより簡単な方法は?


105

ただ便利な質問です。Visual StudioやXCodeのようなIDEのデバッガーに少し甘やかされてきました。import pdb; pdb.set_trace()ブレークポイントを設定するために入力する必要があるのは少し不格好です(私は忘れてしまい、そのままにしておく可能性があるため、ファイルの先頭にpdbをインポートしたくない)。

IDEに表示されるように、Pythonコードにブレークポイントを設定する簡単な方法はありますか?


PyCharmを使用します。Python IDEを使用して実行する場合を除いて、ブレークポイント行を入力するよりも簡単な方法はありますか?
Ciro Santilli郝海东冠状病六四事件法轮功

python -m pdb <your_script>.py then b <line_number>を使用して、選択した行番号(関数の括弧なし)にブレークポイントを設定します。を押しcて、ブレークポイントまで続行します。bコマンドを単独で使用して、すべてのブレークポイントを表示できます。入力helpすると、デバッグ中に使用可能な他のpdbコマンドが表示されます。
arcseldon

1
Python 3.7以降、組み込みbreakpoint()関数を使用できるようになりました。python.org/dev/peps/pep-0553
Daniel

回答:


117

pdb次のコマンドを実行すると、コマンドラインからプログラムを実行できます

python -m pdb your_script.py

1行目でブレークし、breakコマンドを使用してコード内のどこにでもブレークポイントを追加できます。構文は次のとおりです。

b(reak)[[filename:] lineno | 関数[、条件]]

柔軟性があり、どこにでもブレークポイントを追加できます。


24
この点を明確にするために、私pdb.set_trace()がデバッガーに入る場合、lコマンド(リスト)を使用して、27行目にブレークポイントを設定したいことを確認し、次のように入力します: b 27デバッガーは27行目にブレークポイントを設定します(ドキュメントを理解するのは少し難しいので、その点を明確にしたかったのです)。
benjaminmgross 2013

9
また、オブジェクトxがあり、そのメソッドfが呼び出されたときに停止したい場合は、、break x.f次にと言うことができますc(ontinue)。これは、オブジェクトがアクセスできないファイル内にある場合や、たとえばunpickleによって動的に作成された場合でも機能します。
osa 14年

2
スタックトレース後にデバッグするときは、フルパスをモジュールにコピーして、次のように行番号を追加できますb /data/users/me/project/env/local/lib/python2.7/site-packages/django/core/urlresolvers.py:596
有効な

58

以下を使用できます。

from pdb import set_trace as bp

code
code
bp()
code
code

なぜ不要なエイリアシングなのかはわかりませんが、;-)。何らかの理由で、私のIDE /エディター(vscode)はこのAMの馬であり、下線を引いています。あなたのコメントを見て本当に助かりました。すてきな一日を!
MrMesees

どうもありがとうございます!
係留

set_tracebp()を使用する場合にのみインポートを強制するにはどうすればよいですか?
アルパー

39

vimでは、このためのマクロが(私の.vimrcファイルに)設定されています。

map <silent> <leader>b oimport pdb; pdb.set_trace()<esc>
map <silent> <leader>B Oimport pdb; pdb.set_trace()<esc>

したがって、\ b(挿入モードでない場合)を押すだけで、現在の行の後にブレークポイントが追加されるか、\ B(大文字に注意)を押すと、現在の行の前に1つ挿入されます。

うまくいくようです。他のほとんどの「シンプルな」プログラマーエディター(emacs、sublimetextなど)には、これを行うための同様の簡単な方法が必要です。

編集: 私は実際に持っています:

au FileType python map <silent> <leader>b oimport pdb; pdb.set_trace()<esc>
au FileType python map <silent> <leader>B Oimport pdb; pdb.set_trace()<esc>

これは、Pythonソースファイルに対してのみ有効になります。あなたは非常に簡単にjavascriptまたはあなたが使用する他の言語のために同様の行を追加することができます。

2019アップデート(Python 3.7以降)

Python 3.7以降には、vimでbreakpoint()以前のものを置き換えることができるビルトインがありimport pdb; pdb.set_trace()ます。それでも同じように機能します。


2
あなたが持っている場合ニースのソリューション、および追加された行は、あまりにも正しいインデントを持つことになりset autoindent、あなたの中の.vimrcファイル。
ジーリー2014

はい、なぜほとんどのディストリビューションがset autoindent標準で(そして他の多くのオプションも)付属していないのか理解できません。私は新しいシステムで最初に行うことの一つは...より良いのvimrcでプルです
ダニエル

1
registerという名前のvimを使用するだけです!あなたは(のように「D」バッファリングすることをライン保存Dを押してebug)を"dyy、あなたが必要な時はいつでもそれだけでやります"dp"dPvimレジスタを学ぶ!それらは非常に便利で常にサポートされています!
polvoazul 2014年

その後に:wを追加する方法?
ji-ruh

名前付きレジスタの概念をもう少し詳しく説明すると、マクロを記録し、必要な操作を実行してから、マクロを停止できます。次に、マクロの内容をvimrcファイルに貼り付けます。たとえば、マクロをで開始しqd、後で"dp貼り付けます。最後に、命令をレジスタに割り当てて、vimのロード時に常に入力されるようにします。例:let @d = 'oimport pdb; pdb.set_trace()k0:w' 次に、@d行をファイルに貼り付けたいときに使用します。上記はファイルも保存します。ただし、特殊文字(エスケープなど)が含まれるため、(上記のコピー/貼り付けではなく)独自の文字を記録する必要があります。
arcseldon

27

プログラムを実行するたびに(Python 3.2以降で)手動でブレークポイントを設定したくない場合は、たとえば、3行目に直接ブレークポイントを作成し、そこで実行を停止したいとします。

python -m pdb -c "b 3" -c c your_script.py

次の情報が役立ちます。

ユーザーのホームディレクトリまたは現在のディレクトリにファイル.pdbrcが存在する場合、デバッガープロンプトで入力されたかのように読み込まれ、実行されます。これは、エイリアスに特に役立ちます。両方のファイルが存在する場合、ホームディレクトリ内のファイルが最初に読み取られ、そこで定義されたエイリアスがローカルファイルによって上書きされる可能性があります。

バージョン3.2で変更:.pdbrcに、continueやnextなどのデバッグを続行するコマンドを含めることができるようになりました。以前は、これらのコマンドは効果がありませんでした。

バージョン3.2の新機能:pdb.pyが、.pdbrcファイルで指定されているかのようにコマンドを実行する-cオプションを受け入れるようになりました。「デバッガーコマンド」を参照してください。



10

これは、ソースコードに何も実装せずにコマンドラインでpdbを使用する方法です(ドキュメントやその他のオンラインリソースは、これまでにビジュアルデバッガーしか使用していないプログラマーにこれを説明するのに適していません)。

シェルプロンプトで次のように入力して、pdbを起動します。

python -m pdb 'python_script'

このコマンドはpdbを初期化し、pdbデバッガーはpython_scriptの最初の行で中断し、ユーザーからの入力を待ちます。

(Pdb)

デバッガと通信するためのインターフェースです。ここで、ここでコマンドを指定できます。ここでは、ビジュアルデバッガーでボタンやキーボードショートカットを使用するのではなく、コマンドを使用して同じ結果を導き出します。

コマンド「n」(次)を使用して、コードの次の行に移動できます。

(Pdb) n

次を実行すると、行番号とソース内の特定のコードが表示されます。

> python_script(line number)method name
-> current line in the source code

ソースコードで行番号を指定することにより、ブレークポイントを設定できます。

(Pdb) b 50

ここでは、デバッガーは50行目でブレークするように設定されています。他のブレークポイントがない場合、50行目のブレークポイントが最初になり、この場合は1であるブレークポイントIDによって参照できます。さらにブレークポイントを追加すると、識別子が順番に取得されます(2、3など)。

ブレークポイントが設定されたら、次のようにpdbがブレークポイントに到達するまでプログラムを実行し続けます。

(Pdb) c

ブレークポイントに到達したら、前述のnコマンドを使用して、次の行に移動できます。変数の値を調べる場合は、次のようにパラメーターコマンドを実行します。

(Pdb) p variable_name

ブレークポイントが不要になった場合は、clearコマンドでブレークポイントのIDを渡すことにより、ブレークポイントをクリアできます。

(Pdb) clear 1

最後に、デバッガーを使い終わったら、Pythonコマンドラインインタープリターを終了するのと同じように実行を終了できます。

(Pdb) exit()

これが誰でもpdbを使い始めるのに役立つことを願っています。デバッガーで使用できるコマンドのリストを次に示します:pdb so question and Answers



4

PythonデバッグをサポートするIDEを使用するか、優れたWinpdbツールをチェックアウトできます。これはどのプラットフォームでも機能し、Pythonスクリプトにグラフィカルなデバッグ機能を提供します。

http://winpdb.org/


2

以下を使用できます。

  • ウイングイデ
  • pydevプラグインによる日食
  • pycharms

上記はすべて、IDE内からのPythonデバッグをサポートしています。


0

Atomでは、Pythonプラグインがインストールされている場合、「pdb」と入力してEnterで、スニペットがインポートと入力してトレースバックします。

vimで編集していて、ドロップダウンが表示されるのを待っているときでも、たまに入力するだけなので、これに慣れています。


0

過小評価されている方法は、pdbに直接ブレークポイントを設定することです。

pdb> b torch/__init__:10

にブレークポイントを設定します site-packages\torch\__init__.py:10

その後 pdb> c、このブレークポイントで停止します。

以下も有効です。

pdb> b d:\anaconda\lib\site-packages\torch\__init__.py:10
pdb> b torch\__init__.py:10
pdb> b d:\\anaconda\\lib\\site-packages\\torch\\__init__.py:10
pdb> b d:/anaconda/lib/site-packages/torch/__init__.py:10

詳細については、ドキュメントを参照してください。


0

PythonモードプラグインでVimを使用するか、Elpyで Emacsを使用できます。プラグインでます。

これらのプラグインは、簡単なキーストローク(\ bVimとC-c C-u bEmacs)に加えて、重いIDE(コードの折りたたみ、リファクタリング、リンティングなど)の他の多くの機能を備えたブレークポイントを提供します。これらはすべて、軽量のターミナルベースのテキストエディター内にあります。


-1

スクリプトでデバッガを実行する最も簡単な方法は、

pdb your_script.py

Linuxコマンドラインでpdbを実行すると、

usage: pdb.py scriptfile [arg] ...

インストールする方法pdb?それともどこから?
kenorb
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.