私のデバッグのニーズにpdb
は、かなり良いです。ただし、に入ることができれば、はるかにクール(そして役立つ)になりますipython
。これは可能ですか?
回答:
あり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)
ModuleNotFoundError: No module named 'IPython.Debugger'
、ModuleNotFoundError: No module named 'IPython.Shell'
およびImportError: cannot import name 'ipapi'
ModuleNotFoundError: No module named 'IPython.Debugger'
、ModuleNotFoundError: No module named 'IPython.Shell'
そしてImportError: cannot import name 'ipapi'
breakpoint()
ipdbに入る関数を取得する方法があります。
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
def f() : pass ; IPython.embed = f
ようにembed()
呼び出しがNOOPし、Ctrl + Dである
通常、ipythonを使用するときは、「pdb」コマンドを使用して自動デバッグをオンにします。
次に、スクリプトが配置されているディレクトリで「runmyscript.py」コマンドを使用してスクリプトを実行します。
例外が発生した場合、ipythonはデバッガー内のプログラムを停止します。magic ipythonコマンドのヘルプコマンドを確認してください(%magic)
最近、モジュールが少しシャッフルされたようです。IPython 0.13.1では、次のように機能します
from IPython.core.debugger import Tracer; breakpoint = Tracer()
breakpoint() # <= wherever you want to set the breakpoint
残念ながら、qtconsoleではすべてがまったく価値がありません。
新しいバージョンの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インタープリターを埋め込む(さらにはネストする)ことができます。
import IPython.ipapi
namespace = dict(
kissa = 15,
koira = 16)
IPython.ipapi.launch_new_instance(namespace)
プログラムでIPythonシェルを起動します。明らかに、namespace
dictの値は単なるダミー値です-locals()
実際に使用する方が理にかなっているかもしれません。
これをハードコーディングする必要があることに注意してください。それはそのようにpdb
は機能しません。それがあなたが望むものであるならば、DoxaLogosの答えはおそらくあなたが探しているものにもっと似ています。
迅速で簡単な方法:
from IPython.Debugger import Tracer
debug = Tracer()
次に、
debug()
プログラムのデバッグを開始したい場所ならどこでも。
ImportError: No module named 'IPython.Debugger'
Python 3.4 / IPython 3
過去数日間に何度かグーグルで検索しなければならなかったので、答えを追加しました...ipdb.set_trace()
コードにブレークポイントを設定せずに、スクリプトを正常に実行し、エラーが発生した場合にのみipython / ipdbにドロップできると便利な場合があります
ipython --pdb -c "%run path/to/my/script.py --with-args here"
(最初にpip install ipython
そしてpip install ipdb
もちろん)
ipython --pdb -- ./path/to/my/script --with-args here
ターミナルカラーを使用してIPythonのREPLを取得するには、次のことを行う必要がありました。
from IPython import start_ipython
start_ipython()
https://ipython.readthedocs.io/en/stable/api/generated/IPython.html#IPython.start_ipython