web-dev-qa-db-ja.com

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

だから私はPythonスクリプトを実行しています。

_import ipdb; ipdb.set_trace()
_

(iPythonのPDBのバージョンですが、違いはないと思いますが、色付きの出力にのみ使用します)。

今、私はデバッガーに到達したときに、if句やforループなどの複数行のステートメントを実行したいのですが、すぐに入力します

_if condition:
_

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

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

130
Mike

これは、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セッション全体が終了します。

234
Marius Gedminas

Python3では、ipdb(およびpdb)に interact というコマンドがあります。以下に使用できます。

グローバル名前空間に現在のスコープで見つかったすべての(グローバルおよびローカル)名が含まれる( code モジュールを使用して)対話型インタープリターを開始します。

使用するには、pdbプロンプトでinteractと入力するだけです。とりわけ、複数行にわたるコードを適用したり、他のpdbコマンドの偶発的なトリガーを回避するのに役立ちます。

43
vaer-k

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

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

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

30
Garrett Hyde

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

python
ipdb> from IPython import embed; embed()
28
fx-kirin

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

7
ThomasH

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

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

また、通常は複数行を必要とする必要な処理を行うために、事前にいくつかの関数を作成することもできます。

2
zeekay

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

if True:
    print('a')

それはばかげた解決策ですが、汚い迅速かつ作業でもあります。 Linuxターミナルで動作しますが、Windowsコンソールで動作するかどうかはわかりません。

0
bizi