Python独自のデバッガー(PDB)内で複数行のステートメントを実行する方法


157

そのため、次のように記述してPythonスクリプトを実行し、その中でPythonのデバッガPDBを呼び出しています。

import ipdb; ipdb.set_trace()

(iPythonのPDBバージョンですが、問題になるとは思いませんが、カラー出力にのみ使用します)。

ここで、デバッガーに到達したら、if句やforループなどの複数行のステートメントを実行したいのですが、

if condition:

リターンキーを押すと、エラーメッセージが表示されます *** SyntaxError: invalid syntax (<stdin>, line 1)

PDB内で複数行のステートメントを実行するにはどうすればよいですか?可能でない場合、if句またはforループを実行する方法はありますか?

回答:


265

pdbでこれを行うと、利用可能なすべてのローカル変数を使用して一時的なインタラクティブPythonセッションを起動できます。

(pdb) !import code; code.interact(local=vars())
Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41) 
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> 

完了したら、Ctrl-Dを使用して通常のpdbプロンプトに戻ります。

Ctrl-Cキーを押さないでください。pdbセッション全体が終了します。


46
同じことは、pdb interactコマンドを使用して達成できるようです(このバグ追跡メッセージから学んだように)。
gerrit 2014年

3
なぜステートメントに!必要なのimportですか?
Indradhanush Gupta 2014

19
おそらく必要ないでしょうが、私は!事故を避けるためにpdbのすべてのPythonステートメントの前にを付ける習慣があります。たとえばc = 42、pdb では、変数に割り当てる代わりに実行を継続しますc
Marius Gedminas

8
@MariusGedminasはPDBで最もイライラするものです!コマンドにプレフィックスを付ける必要がある場合はすばらしいと思います...
Ian Clark

注:Ctrl-D interactも終了する正しい方法のようですが、Spyderでうまく動作しません。
Josiah Yoder

69

python3 ipdb(およびpdb)には、interactというコマンドがあります。次の目的で使用できます。

グローバルネームスペースに現在のスコープで見つかったすべての(グローバルおよびローカル)名が含まれている対話型インタープリターを(コードモジュールを使用して)起動します。

これを使用するにinteractは、pdbプロンプトで単に入力します。特に、複数行にまたがるコードを適用したり、他のpdbコマンドが誤ってトリガーされたりするのを防ぐのに役立ちます。


2
その際、「NameError:name 'interact' is not defined」というメッセージが表示されます。
Jason

1
@jasonバージョン3.2以降
vaer-K

2
それは説明します。私はpython 2.7でした。
Jason

これが実際に相互作用する可能性のあるエラーを
スローした

1
避けることを提案するのinteractは強すぎる提案だと思います。90%がこれは私が今までに必要なすべてであり、それはより入力するはるかに簡単ですfrom IPython import embed; embed()
vaer-kの

43

私の推奨は、IPython埋め込みを使用することです。

ipdb> from IPython import embed; embed()

2
リスト内包表記で値が定義されていないエラーがある場合は、IPythonから使用してみてくださいimport embed; embed(user_ns=locals())
fx-kirin

1
これは、受け入れられた答えよりもはるかにうまく機能します。たとえば、複数行を適切に編集できるようにします-数行前に戻って何かを修正するようなものなので、複数行式全体を再度書き換える必要はありません...ローカルを@ fx-kirinとして渡します提案した。
ZeDuS

33

Python(2.7.1)インタープリターまたはデバッガー(pdbのインポート)内では、次の構文で複数行のステートメントを実行できます。

for i in range(5): print("Hello"); print("World"); print(i)

注:インタープリター内にいるときは、コードを実行する前にreturnを2回押す必要があります。ただし、デバッガー内では、returnキーを1回押すだけで済みます。


5
1レベルより深いものを実行することはできません。
アントニーハッチキンズ

7

ブレークポイントに到達したときにいくつかのコマンドを実行したい場合は、特別なケースがあります。次に、デバッガコマンドがありますcommands。複数行のコマンドを入力し、シーケンス全体をendキーワードで終了することができます。もっと(pdb) help commands


2

これができるかどうかはわかりませんが、ipdbの優れた機能になるでしょう。もちろんリスト内包表記を使用して、次のような簡単な複数行の式を実行できます。

if y == 3: print y; print y; print y;

また、いくつかの関数を事前に記述して、通常は複数行を実行する必要があることをすべて実行することもできます。


-6

テキストエディターでコードを記述し、デバッガーに貼り付けます。

if True:
    print('a')

それはばかげた解決策ですが、汚れてすぐに機能します。Linux端末で動作しますが、Windowsコンソールで動作するかどうかはわかりません。


3
正直なところ、私は、外部プログラムを呼び出す書き込み、コピー&ペーストすることであると言うことではないでしょう速い P:、ちょうど汚い
データScientician

4
これ、私のために仕事をしませんでした、とthew*** SyntaxError: unexpected EOF while parsing
ヤシュ・カント
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.