コードからipythonに入ることができますか?


81

私のデバッグのニーズにpdbは、かなり良いです。ただし、に入ることができれば、はるかにクール(そして役立つ)になりますipython。これは可能ですか?

回答:


112

ありipdbあなただけ行うことができますので、標準PDBにiPythonを埋め込むプロジェクトは:

import ipdb; ipdb.set_trace()

通常の方法でインストールできますpip install ipdb

ipdbはかなり短いので、easy_installingの代わりipdb.pyに、Pythonパスのどこかにファイルを作成して、ファイルに以下を貼り付けることもできます。

import sys
from IPython.Debugger import Pdb
from IPython.Shell import IPShell
from IPython import ipapi

shell = IPShell(argv=[''])

def set_trace():
    ip = ipapi.get()
    def_colors = ip.options.colors
    Pdb(def_colors).set_trace(sys._getframe().f_back)

Djangoで驚くほどうまく機能します。入力しているテキストが表示されないという事実を除けば、おそらく簡単に修正できます(ipdbは6行しかないため)。
Xiong Chiamiov 2010年

4
実際、問題は、Djangoが実行サーバー用に別のスレッドをフォークし、コードを編集するたびにスレッドを再生成することです。これは通常は正常に機能しますが、スレッドが強制終了されたときにpdbに座っていると、ターミナルが異常になります。これを修正するには、runserverから抜け出し、runniny'stty sane 'を実行してから、runserverを再起動します。
Jeremy Dunck 2011

1
@ダニエル・ローズマンこんにちは、私は取得ModuleNotFoundError: No module named 'IPython.Debugger'ModuleNotFoundError: No module named 'IPython.Shell'およびImportError: cannot import name 'ipapi'
SebMa

1
@memoselykこんにちは、私は取得しますModuleNotFoundError: No module named 'IPython.Debugger'ModuleNotFoundError: No module named 'IPython.Shell'そしてImportError: cannot import name 'ipapi'
SebMa 2018年

breakpoint()ipdbに入る関数を取得する方法があります。
gerrit 2018

53

IPython 0.11では、次のようにIPythonをコードに直接埋め込むことができます。

あなたのプログラムはこのように見えるかもしれません

In [5]: cat > tmpf.py
a = 1

from IPython import embed
embed() # drop into an IPython session.
        # Any variables you define or modify here
        # will not affect program execution

c = 2

^D

これは、実行すると発生します(既存のipythonセッション内で任意に実行することを選択しました。私の経験では、このようなipythonセッションをネストすると、クラッシュする可能性があります)。

In [6]:

In [6]: run tmpf.py
Python 2.7.2 (default, Aug 25 2011, 00:06:33)
Type "copyright", "credits" or "license" for more information.

IPython 0.11 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.

In [1]: who
a       embed

In [2]: a
Out[2]: 1

In [3]:
Do you really want to exit ([y]/n)? y


In [7]: who
a       c       embed

このIPythonセッションへのドロップは非常にクールです。どうもありがとうございます!
joon 2012

1
私はこれを(ほぼ無限の)ループの中に愚かに配置しました。どうすれば抜け出すことができますか?
gerrit 2014年

2
@gerrit、まだそこにいる場合はCtrl + dを押します。
confused00

2
@ confused00それは、6か月後、
非常に

1
@gerrit、あなたは埋め込みループ内で立ち往生している場合は、次のdef f() : pass ; IPython.embed = fようにembed()呼び出しがNOOPし、Ctrl + Dである
MatrixManAtYrService

12

より新しいバージョンのIPython(> 0.10.2)を使用している場合は、次のようなものを使用できます。

from IPython.core.debugger import Pdb
Pdb().set_trace()

しかし、ipdbを使用する方がおそらく良いでしょう


11

と同等

import pdb; pdb.set_trace()

IPythonでは次のようなものです。

from IPython.ipapi import make_session; make_session()
from IPython.Debugger import Pdb; Pdb().set_trace()

少し冗長ですが、ipdbがインストールされていないかどうかを知っておくとよいでしょう。make_sessionコールはなど、カラースキームを設定するために一度必要とされ、set_trace呼び出しは、あなたが分割する必要がどこにでも配置することができます。


8

通常、ipythonを使用するときは、「pdb」コマンドを使用して自動デバッグをオンにします。

次に、スクリプトが配置されているディレクトリで「runmyscript.py」コマンドを使用してスクリプトを実行します。

例外が発生した場合、ipythonはデバッガー内のプログラムを停止します。magic ipythonコマンドのヘルプコマンドを確認してください(%magic)


したがって、ipython.set_trace()のようなものを書く方法はありませんか?:)
Geo

8

ブレークポイントを設定したいスクリプトにこのワンライナーを貼り付けるのが好きです。

__import__('IPython').Debugger.Pdb(color_scheme='Linux').set_trace()

新しいバージョンは以下を使用する可能性があります:

__import__('IPython').core.debugger.Pdb(color_scheme='Linux').set_trace()


5

新しいバージョンのIPythonは、IPythonセッションを任意のPythonプログラムに埋め込んでネストするための簡単なメカニズムを提供します。次のレシピに従って IPythonセッションを埋め込むことができます。

try:
    get_ipython
except NameError:
    banner=exit_msg=''
else:
    banner = '*** Nested interpreter ***'
    exit_msg = '*** Back in main IPython ***'

# First import the embed function
from IPython.frontend.terminal.embed import InteractiveShellEmbed
# Now create the IPython shell instance. Put ipshell() anywhere in your code
# where you want it to open.
ipshell = InteractiveShellEmbed(banner1=banner, exit_msg=exit_msg)

次にipshell()、IPythonシェルにドロップするときはいつでも使用します。これにより、コードにIPythonインタープリターを埋め込む(さらにはネストする)ことができます。


3

IPythonドキュメントから:

import IPython.ipapi
namespace = dict(
    kissa = 15,
    koira = 16)
IPython.ipapi.launch_new_instance(namespace)

プログラムでIPythonシェルを起動します。明らかに、namespacedictの値は単なるダミー値です-locals()実際に使用する方が理にかなっているかもしれません。

これをハードコーディングする必要があることに注意してください。それはそのようにpdbは機能しません。それがあなたが望むものであるならば、DoxaLogosの答えはおそらくあなたが探しているものにもっと似ています。


3

迅速で簡単な方法:

from IPython.Debugger import Tracer
debug = Tracer()

次に、

debug()

プログラムのデバッグを開始したい場所ならどこでも。


1
ImportError: No module named 'IPython.Debugger'Python 3.4 / IPython 3
ostrokach 2015年

2

過去数日間に何度かグーグルで検索しなければならなかったので、答えを追加しました...ipdb.set_trace()コードにブレークポイントを設定せずに、スクリプトを正常に実行し、エラーが発生した場合にのみipython / ipdbにドロップできると便利な場合があります

ipython --pdb -c "%run path/to/my/script.py --with-args here"

(最初にpip install ipythonそしてpip install ipdbもちろん)


1
ありがとうございました!もう少し簡単です:ipython --pdb -- ./path/to/my/script --with-args here
alisianoi 2015年

0

これは非常に簡単です。

ipython some_script.py --pdb

iPythonをインストールする必要があります。通常、これは機能します。 pip install ipython

私はipythonの代わりにipython3を使用しているので、それがPythonの最近のバージョンであることがわかります。

Pythonの代わりにiPythonを使用し、最後に--pdbを追加するだけなので、これは覚えやすいです。


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