使用nosetests --pdb选项设置断点

91

nosetests --pdb可以让我在出现错误或失败时停止,但这对我的需求来说太晚了。在执行过程中逐步查看代码可以帮助我调试问题所在。

然而,nosetest非常有用,因为它们允许依赖相对导入的测试(即包中的测试)。

我如何在执行测试之前设置断点? 目前,我正在使用:

python -m pdb /path/to/my/nosetests testfile.py

这个解决方案不够好。Nosetests会干扰pdb的输出,而且我的键盘控制(如箭头键)也失效了。

使用import pdb; pdb.set_trace()似乎是个好主意,然而nosetests正在阻止我访问pdb控制台。

4个回答

149

比起记得使用 -s,更好的办法是使用 Nose 自带的 set_trace 变量。添加:

甚至比记得使用 -s 更好的办法,是使用 Nose 自带的 set_trace 变量。添加:

from nose.tools import set_trace; set_trace()

任何您想要插入调试器的地方。stdin/out重定向将由系统自动处理。我遇到的唯一奇怪的副作用是在使用nose运行时,无法在pdb内重启您的代码(使用run)。


这个有任何文档吗?如何跳出循环? - A.J.
你是想知道在启动pdb后如何进行导航吗?我确定有文档,但是就我的经验而言- s "步入"一个函数调用,n 转到下一条语句,u 在堆栈中向上移动,d 在堆栈中向下移动。您可以使用 b 设置断点,使用c 来“继续”并退出跟踪调试器。希望这有所帮助! - Matt Luongo
4
这应该被接受为答案。它提供了原始pdb.set_trace()命令的所有常规功能。 - tbm
1
有没有可能推出一个ipython/ipdb版本的呢? - gerrit

125

你可以添加

import pdb; pdb.set_trace() 

在你想要在调试器中停止的源代码中的任何位置。

确保向nose传递-s,这样它就不会捕获stdout


我正要将这个添加到我的问题中。这也不是一个可接受的解决方案。当在 nosetests 中使用它时,很明显它无法使用,因为 pdb 控制台被屏蔽了,也不能执行任何 pdb 命令。 - Devin
27
在运行nosetests时添加"-s"标志以防止其捕获stdout,然后您将能够正常使用pdb。 - Ned Batchelder
1
不起作用。 使用这个:from nose.tools import set_trace; set_trace() - anilbey

5

如果您拥有 IPython ,为了无限的神奇体验,请使用:

import ipdb; ipdb.set_trace() 

*无限的神奇:就像IPython一样-自动补全、着色等。


1
如果您正在使用 pytest,您可以使用以下代码:

import pytest; pytest.set_trace()

请参见 文档

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接