pdb.set_trace()导致nosetests卡住,无法进入调试器
我正在用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]