是否可以从代码进入ipython?


81

对于我的调试需求,pdb还算不错。但是,如果可以的,它会更酷(并且很有帮助)ipython。这可能吗?

Answers:


112

有一个ipdb项目将iPython嵌入到标准pdb中,因此您可以执行以下操作:

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只有六行)。
熊加米奥夫

4
实际上,问题在于Django为Runserver分配了一个单独的线程,并且每当您进行代码编辑时,它都会重新生成该线程。这通常可以正常工作,但是如果您在线程被杀死时坐在pdb中,则终端会发疯。您可以通过中断运行服务器,运行“ stty sane”,然后再次启动运行服务器来解决此问题。
杰里米·邓克

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

有一种使breakpoint()函数进入ipdb的方法。
Gerrit

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会话非常酷。非常感谢!
2012年

1
我愚蠢地将其放置在(几乎无限)循环中。我怎么能出去?
格里特

2
@gerrit,如果您仍在其中,请按Ctrl + d。
confused00

2
@ confused00那本来是无限的,六个月后;-)
gerrit 2015年

1
@gerrit,如果您陷入了嵌入循环:则def f() : pass ; IPython.embed = fembed()调用为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”命令打开自动调试功能。

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

如果出现异常,ipython将在调试器中停止程序。查看帮助命令以获取神奇的ipython命令(%magic)


所以没有办法写类似ipython.set_trace()的东西吗?:)
地理

8

我只想将此单行代码粘贴到我要设置断点的脚本中:

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

较新的版本可能使用:

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

6

看起来模块最近已经改头换面了。在IPython 0.13.1上,以下对我有用

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

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

虽然可惜,但在qtconsole中这一切都一文不值


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 Shell中就可以使用。这将允许您在代码中嵌入(甚至嵌套)IPython解释器。


3

IPython文档

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

将以编程方式启动IPython Shell。显然,namespace字典中的值只是虚拟值-使用它可能更有意义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

2

如果最近几天我不得不用谷歌搜索一下,以便添加一个答案...有时能够正常运行脚本,并且仅在出现错误时放入ipython / ipdb中,而不必ipdb.set_trace()在代码中放入断点是一件很不错的事情

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

(第一pip install ipythonpip install ipdb当然)


1
谢谢!简单一点:ipython --pdb -- ./path/to/my/script --with-args here
alisianoi 2015年

0

这很简单:

ipython some_script.py --pdb

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

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

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.