関数の実行中にPythonインタープリターにドロップ


90

私は関数を持つPythonモジュールを持っています:

def do_stuff(param1 = 'a'):
    if type(param1) == int:
        # enter python interpreter here
        do_something()
    else:
        do_something_else()

コメントがあるコマンドラインインタープリターにドロップする方法はありますか?次のようにPythonで実行すると:

>>> import my_module
>>> do_stuff(1)

次のプロンプトは、コメントがある場所のスコープとコンテキストで表示されdo_stuff()ますか?


回答:


60

挿入

import pdb; pdb.set_trace()

その時点でPythonデバッガに入ります

こちらをご覧ください:http : //docs.python.org/library/pdb.html


pdb素晴らしいバニラパイソンです。外部パッケージを取り込む余地があればipdb素晴らしいです-デバッガーと同じ機能ですが、ipythonの構文の強調表示、タブ補完などがあります
khstacking

更新— ipdb廃止されました。最近はpdbpppdb++を使用していますが、これは同様の機能を備え、動作しますimport pdb; pdb.set_trace()(つまり、インポートするパッチであるため、ドロップイン置換です)
ドリフトキャッチャー

@hangtwenty:なぜipdb廃止されたと言うのですか?そのニュースは見つかりません。
Nick Matteo

@Kundorハァッ、あなたは正しい。作者がプロジェクトの保守を中止することを決定し、代わりに使用する別のプロジェクトをポイントしたことをどこかで読んだことをはっきり覚えています。たぶんそれは少しの間起こり、それから復活しましたか?私は間違っている可能性があります!どちらの場合でも、ipdb以前は楽しんでいましたが、それpdbpp以降は楽しんでいます
ドリフトキャッチャー

141

(prestomationで表示されるように、デバッガーの代わりに)標準の対話型プロンプトが必要な場合は、次のようにできます。

import code
code.interact(local=locals())

参照:コードモジュールを

IPythonをインストールしていて、代わりにIPythonシェルが必要な場合は、IPython> = 0.11でこれを行うことができます。

import IPython; IPython.embed()

または古いバージョンの場合:

from IPython.Shell import IPShellEmbed
ipshell = IPShellEmbed()
ipshell(local_ns=locals())

27
IPython> = 0.11の場合、IPythonにはシェルモジュールはもうありません...代わりに「IPythonのインポート; IPython.embed()」を使用してシェルを開始します。
evandrix 2011

code.interact()la PDBに入った後も続行できc(ontinue)ますか?
ニックT

4
code.interact()ブロッキングコールです。プログラムは停止し、終了するまで待機します。対話型インタープリターを終了すると、プログラムは直後のステートメントから再開する必要があります。
マットアンダーソン

1
対話型プロンプトとデバッガーの違いは何ですか?
StockB 16

1
@StockB 重要なのは、標準の対話型プロンプトです。デバッガは、対話プロンプトが、それは同じではありません。PDBでは、複数行のステートメントを実行できない、組み込み関数がオーバーライドされるなどhelp
kbrose

28

デフォルトのPythonインタープリターが必要な場合は、

import code
code.interact(local=dict(globals(), **locals()))

これにより、ローカルとグローバルの両方にアクセスできます。

IPythonインタープリターにドロップしたい場合、IPShellEmbedソリューションは古くなっています。現在動作するのは:

from IPython import embed
embed()

8
おかげで、後者はパッケージを再インポートするためcode.interact(local=dict(globals(), **locals()))よりもはるかに優れていcode.interact(local=locals())ます
s2t2 2015年

Pythonコードを呼び出すためにbashスクリプトを使用していたので、この答えは私にとってよりうまくいきました。受け入れられた回答を使用してPythonコードを操作できませんでした。ありがとう!
ジョナサン・キング
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.