对于我的调试需求,pdb
还是不错的。但是,如果我能进入ipython
. 这件事可能吗?
13 回答
有一个ipdb
项目将 iPython 嵌入到标准 pdb 中,所以你可以这样做:
import ipdb; ipdb.set_trace()
它可以通过通常的pip install ipdb
.
ipdb
很短,因此您也可以ipdb.py
在 Python 路径的某个位置创建一个文件,而不是 easy_installing,然后将以下内容粘贴到文件中:
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)
在 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 (> 0.10.2) 版本,则可以使用类似
from IPython.core.debugger import Pdb
Pdb().set_trace()
但最好只使用 ipdb
相当于
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
调用放置在您需要中断的任何地方。
我喜欢简单地将这个单行代码粘贴到我想要设置断点的脚本中:
__import__('IPython').Debugger.Pdb(color_scheme='Linux').set_trace()
较新的版本可能会使用:
__import__('IPython').core.debugger.Pdb(color_scheme='Linux').set_trace()
通常,当我使用 ipython 时,我会使用其中的“pdb”命令打开自动调试。
然后我在我的脚本所在的目录中使用“run myscript.py”命令运行我的脚本。
如果我遇到异常,ipython 会在调试器中停止程序。查看魔术 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 shell 时使用。这将允许您在代码中嵌入(甚至嵌套)IPython 解释器。
来自IPython 文档:
import IPython.ipapi
namespace = dict(
kissa = 15,
koira = 16)
IPython.ipapi.launch_new_instance(namespace)
将以编程方式启动 IPython shell。显然 dict 中的值只是虚拟值 -在实践namespace
中使用可能更有意义。locals()
请注意,您必须将其硬编码;它不会像现在这样工作pdb
。如果这就是您想要的,DoxaLogos 的答案可能更像您正在寻找的。
如果最近几天我不得不用谷歌搜索几次,所以添加一个答案......有时能够正常运行脚本并且只在出现错误时才进入 ipython/ipdb 是很好的,而不必ipdb.set_trace()
在代码中放置断点
ipython --pdb -c "%run path/to/my/script.py --with-args here"
(首先pip install ipython
,pip install ipdb
当然)
快速简便的方法:
from IPython.Debugger import Tracer
debug = Tracer()
然后就写
debug()
无论您想在哪里开始调试程序。
要使用终端颜色获得 IPython 的 REPL,我必须这样做:
from IPython import start_ipython
start_ipython()
https://ipython.readthedocs.io/en/stable/api/generated/IPython.html#IPython.start_ipython
这很简单:
ipython some_script.py --pdb
它需要安装 iPython,通常这样可以:
pip install ipython
我使用 ipython3 而不是 ipython,所以我知道它是 Python 的最新版本。
这很容易记住,因为您只需使用 iPython 而不是 python,并将 --pdb 添加到末尾。