是否有可能从代码进入ipython?

时间:2009-07-14 17:45:59

标签: python shell debugging ipython pdb

对于我的调试需求,pdb非常好。但是,如果我可以进入ipython,它将很多更酷(并且有帮助)。这件事有可能吗?

13 个答案:

答案 0 :(得分:109)

有一个ipdb项目将iPython嵌入到标准pdb中,所以你可以这样做:

import ipdb; ipdb.set_trace()

它可以通过通常的pip install ipdb安装。

ipdb非常简短,因此您可以在Python路径上的某处创建文件ipdb.py,而不是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)

答案 1 :(得分: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

答案 2 :(得分: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次呼叫可以放置在需要中断的任何地方。

答案 3 :(得分:11)

如果您使用的是更现代版的IPython(> 0.10.2),您可以使用类似

的内容
from IPython.core.debugger import Pdb
Pdb().set_trace()

但是使用ipdb

可能更好

答案 4 :(得分:8)

通常,当我使用ipython时,我会在其中使用“pdb”命令打开自动调试。

然后我在脚本所在的目录中使用“run myscript.py”命令运行我的脚本。

如果我收到异常,ipython会在调试器中停止程序。查看magic ipython命令的帮助命令(%magic)

答案 5 :(得分:8)

我想在我想要设置断点的脚本中粘贴这个单行代码:

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

较新的版本可能会使用:

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

答案 6 :(得分:6)

看起来模块最近已被洗牌了一下。在IPython 0.13.1上,以下适用于我

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

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

虽然唉,但它很漂亮worthless in qtconsole

答案 7 :(得分:5)

较新版本的IPython提供了一种简单的机制,可以将IPython会话嵌入和嵌套到任何Python程序中。您可以按the following recipe嵌入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 shell时,都要使用ipshell()。这将允许您在代码中嵌入(甚至嵌套)IPython解释器。

答案 8 :(得分:3)

来自IPython docs

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

将以编程方式启动IPython shell。显然namespace dict中的值只是虚拟值 - 在实践中使用locals()可能更有意义。

请注意,您必须对此进行硬编码;它不会像pdb那样工作。如果这就是你想要的,DoxaLogos的答案可能更像你正在寻找的。

答案 9 :(得分:3)

快捷方式:

from IPython.Debugger import Tracer
debug = Tracer()

然后写下

debug()

您想要开始调试程序的任何地方。

答案 10 :(得分:2)

我不得不谷歌这几次,如果过去几天这样添加一个答案...有时候能够正常运行脚本并且只在错误时掉入ipython / ipdb是很好的,而不必放{{1断点到代码中

ipdb.set_trace()

(当然,首先ipython --pdb -c "%run path/to/my/script.py --with-args here" pip install ipython

答案 11 :(得分:0)

这很简单:

ipython some_script.py --pdb

它需要安装iPython,通常可以正常工作: pip install ipython

我使用ipython3而不是ipython,所以我知道它是Python的最新版本。

这很容易记住,因为您只是使用iPython而不是python,并在末尾添加--pdb。

答案 12 :(得分:0)

要使用终端颜色获得IPython的REPL,我必须这样做:

from IPython import start_ipython

start_ipython()

https://ipython.readthedocs.io/en/stable/api/generated/IPython.html#IPython.start_ipython