2013-01-31 39 views
28

说我有一个IPython的会议上,我称之为一些脚本:断点引起的Python交互式调试与IPython的

> run my_script.py 

有没有办法诱使断点my_script.py从中我可以检查我的工作区来自IPython?

我记得读,在IPython中的早期版本中一个可以这样做:

from IPython.Debugger import Tracer;  

def my_function(): 
    x = 5 
    Tracer() 
    print 5; 

但子模块Debugger似乎没有可用了。

假设我已经打开了一个IPython会话:如何停止我的程序所选位置并使用IPython检查我的工作空间?

一般来说,我更喜欢那些不需要我预先指定行号的解决方案,因为我想可能有多于一个这样的呼叫到​​以上,并且不必跟踪他们的行号是。

+0

出于好奇,为什么你会想要多个跟踪器一次?在这一点上,你应该做日志记录,而不是调试。 – Wilduck

+0

@Wilduck:我想在某些情况下检查我的工作区,这些情况可能发生在我的代码的不同位置。 –

+0

好的,也许我说的很差。我明白你为什么想要查看代码的不同部分。你为什么要在你的代码中同时使用这些跟踪器?如果您没有使用调试器来永久修复一个错误(即一次发现一个错误),那么设置日志记录以自动收集有关您的程序在各种状态下运行的信息会不会更好/更容易?我在问,因为你似乎在尝试使用调试工具来处理日志记录。 – Wilduck

回答

27

​​仍然存在于ipython中的不同模块中。你可以做到以下几点:

注意附加呼叫的括号Tracer

编辑Traceris deprecated你应该使用set_trace()代替

+1

@Arnon如何使用'set_trace()';哪个'set_trace'?普通的'ipdb.set_trace()'产生[这个问题对我来说](https://stackoverflow.com/q/35613249/1175496),建议使用'Tracer()()'!哦,也许'[Pdb.set_trace()'看到[这里](https://ipython.org/ipython-doc/rel-0.13.1/api/generated/IPython.core.debugger.html#IPython.core。 debugger.Pdb.set_trace)或[这里](https://stackoverflow.com/a/1127087/1175496); [链接文档](http://ipython.readthedocs.io/en/stable/api/generated/IPython.core.debugger.html)描述了'IPython.core.debugger.set_trace',但我没有FUNC。 –

+0

链接的文档是为IPython 6(它只支持Python 3),我怀疑是你使用的是旧版本。即使已弃用,IPython.core.debugger.Tracer仍然存在并可用于IPython 6。我想你可以继续使用它一段时间,直到它实际上从代码库中删除。 – pankaj

+0

哈哈,那是真的,我正在使用'示踪器',但希望有人可以描述推荐的选择? –

5

里面IPython的外壳,比如,你可以做

from IPython.core.debugger import Pdb 
pdb = Pdb() 
pdb.runcall(my_function) 

,或做你的函数内部的正常pdb.set_trace()

+1

谢谢,但尚不清楚第一种解决方案如何让我指定**我可能选择的断点**位置。至于第二个,我将如何使用该选项?最后,根据我的理解,'pdb'没有提供IPython用于内省的相同功能,等等。是正确的吗? –

+0

运行调试器后,可以使用'b' pdb命令定义断点。 – Kos

15

您可以运行它,并在给定的行设置断点:

run -d -b12 myscript 

其中-B 12设置在线路12断点当你进入这一行,你会立即放入PDB,和您需要输入c才能执行到该断点。

+0

谢谢@Wildluck。这绝对有用,但我对某些不需要指定行号的东西感兴趣。 –

5

我一直有同样的问题,我已经找到了最好的解决方法,这是相当hackey是添加一条线,将打破我的代码,如下所示:

... 
a = 1+2 
STOP 
... 

后来,当我运行的代码,它将打破,我可以做%调试去那里和检查。您也可以打开%pdb以始终转到代码中断的地方,但如果您不想在任何地方进行检查并且每次检测到代码中断时都可能会引起麻烦。我会喜欢更优雅的解决方案。

7

这是使用set_trace()方法的版本,而不是已弃用​​one。

from IPython.core.debugger import Pdb 

def my_function(): 
    x = 5 
    Pdb().set_trace() 
    print 5 
+0

我想添加此答案作为评论上面接受的答案,但我没有足够的声誉评论,所以我希望如果这个答案可以帮助任何人 –

+0

另外,你可以直接使用'IPython.core.debugger.set_trace ()'而不需要'Pdb'。 –