2009-07-14 59 views

回答

104

有一个ipdb项目,该项目的IPython嵌入到标准的pdb,所以你可以这样做:

import ipdb; ipdb.set_trace() 

这是安装通过通常pip install ipdb

ipdb很短,所以不是easy_installing你也可以在Python路径上创建文件ipdb.py地方和以下内容粘贴到文件中:

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) 
+2

太棒了!这太酷了! – Geo 2009-07-14 18:22:02

+0

与Django的效果非常好。好吧,除了我看不到我输入的文本,但这可能很容易修复(因为ipdb只有六行)。 – 2010-01-24 12:50:38

+4

实际上,问题在于Django为runserver分配了一个单独的线程,并且在您进行代码编辑时,它会重新生成线程。这通常工作正常,但如果你坐在pdb线程死亡,终端疯了。你可以通过跳出runserver,runniny'stty sane'来解决这个问题,然后再次启动runserver。 – 2011-09-12 20:17:13

8

通常,当我使用ipython的时候,我会用它里面的“pdb”命令打开自动调试。

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

如果我得到一个异常,ipython会停止调试器中的程序。退房的帮助下命令IPython的命令魔术(%魔法)

+0

所以没有写东西像ipython.set_trace的方式()? :) – Geo 2009-07-14 18:10:08

3

IPython docs

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

将编程启动一个IPython的壳。显然,namespace字典中的值只是虚拟值 - 在实践中使用locals()可能更有意义。

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

11

import pdb; pdb.set_trace() 

等效与IPython是类似的:

from IPython.ipapi import make_session; make_session() 
from IPython.Debugger import Pdb; Pdb().set_trace() 

这有点冗长,但很高兴知道你是否没有安装ipdb。呼叫需要一次来设置配色方案等,并且set_trace呼叫可以放置在任何需要中断的地方。

3

的快速而简便的方法:

from IPython.Debugger import Tracer 
debug = Tracer() 

然后只写

debug() 

,无论你想开始调试程序。

+1

`ImportError:在python 3.4/IPython上没有名为'IPython.Debugger'的模块3 – ostrokach 2015-05-31 15:33:37

47

在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 
7

我想简单地粘贴在我的脚本这一个班轮,我想设置一个断点:

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

较新的版本可以使用:

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

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

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

但是,它可能会更好地使用ipdb

6

看起来模块最近已经混乱了一点。在IPython的0.13.1以下工作对我来说

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

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

虽然很可惜,这一切都非常worthless in qtconsole

4

较新版本的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) 

然后使用ipshell(),每当你想放到一个IPython的外壳。这将允许您在代码中嵌入(甚至嵌套)IPython解释器。

2

我不得不谷歌这一对夫妇,如果时间过去几天所以添加一个答案...有时很高兴能够正常运行脚本,只有放入ipython/ipdb的错误,而不必把ipdb.set_trace()断点到代码

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

(第一pip install ipythonpip install ipdb当然)

相关问题