pdb.set_trace()导致nosetests卡住,无法进入调试器

55 投票
3 回答
9268 浏览
提问于 2025-04-17 11:07

我正在用nosetests运行一系列测试(.py文件)。使用经典的

import pdb; pdb.set_trace()

但是nosetests运行时总是无法完成。它在设置的断点那里卡住了,但从来没有进入pdb调试器。

有人知道这可能是什么原因吗?我尝试把断点移动到不同的位置(其他测试函数、其他文件),但都没有效果。

3 个回答

0

在我的情况下,使用 -s/--nocapture 这个标志还是没能解决问题,编译器还是进入了调试模式。

你可以考虑的另一个原因是,如果你在测试中使用了像 MySQL 这样的数据库,可能会被其他同时运行的进程锁住。在我的例子中,我启动了一个 Python 终端,通过 SQL Alchemy 查询 MySQL 数据库,这导致了表被锁定。因此,我的 nose 测试就卡住了,无法运行或退出。

我结束了那些锁住表的 Python 进程,结果 nose 又可以正常工作了。

> $ ps auxww | grep python | awk '{print $2}' | sudo xargs kill -9

39

Nose正在捕捉输出并进行重定向。所以,虽然你设置的断点被触发了,但你看不到它。你需要关闭输出重定向,这样调试信息才能显示在屏幕上。

Nose可以为你做到这一点,如果你使用:

from nose.tools import set_trace; set_trace()

而不是:

import pdb;pdb.set_trace()
61

运行nose时加上 -s--nocapture 这个选项,你就可以看到pdb的提示符,并且可以正常使用调试器。

如果是在命令行中使用,这意味着:

python manage.py  test -s [other-opts-and-args]

撰写回答