web-dev-qa-db-ja.com

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

私のデバッグの必要性に関しては、pdbはかなり良いです。ただし、ipythonにアクセスできればmuch涼しい(そして役立つ)でしょう。これは可能ですか?

78
Geo

IPythonを標準のpdbに埋め込むipdbプロジェクトがあるので、次のようにすることができます。

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)
109
Daniel Roseman

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
53
Alex Gaudio

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

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

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

12
chrisdev

同等のもの

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呼び出しは、中断する必要がある任意の場所に配置できます。

11
ars

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

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

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

8
Jay Atkinson

ブレークポイントを設定するスクリプトに、この1行を貼り付けるだけです。

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

新しいバージョンでは以下を使用できます:

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

最近、モジュールが少し変わったようです。 IPython 0.13.1では、次のように動作します

from IPython.core.debugger import Tracer; breakpoint = Tracer()

breakpoint() # <= wherever you want to set the breakpoint

悲しいかな、それはすべてかなり qtconsoleでは役に立たない です。

6
beardc

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)
_

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

IPython docs から:

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

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

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

3
David Z

速くて簡単な方法:

from IPython.Debugger import Tracer
debug = Tracer()

次に書くだけ

debug()

プログラムのデバッグを開始する場所。

3
Viktiglemma

私はこれを数日ググる必要があったので、答えを追加しました...時々スクリプトを正常に実行でき、エラー時にipython/ipdbにドロップするだけでいいです。ipdb.set_trace()を入力する必要はありませんコードへのブレークポイント

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

(最初 pip install ipythonおよびpip install ipdb もちろん)

2
Anentropic

これは非常に簡単です。

ipython some_script.py --pdb

IPythonのインストールが必要です。通常、これは機能します:pip install ipython

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

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

0
Luke Stanley