如何用pdb调试库模块?sklearn.roc_auc_score断点失效求助
如何在sklearn库函数内部设置pdb断点?
我懂你遇到的困扰了——明明给roc_auc_score设了断点,调用函数时却直接执行完毕,完全没触发中断。这是因为pdb对导入的库函数的断点定位需要更明确的指向,咱们来一步步解决这个问题:
先还原你的操作步骤(方便对照问题)
>>> import numpy as np >>> from sklearn.metrics import roc_auc_score >>> y_true = np.array([0, 0, 1, 1]) >>> y_scores = np.array([0.1, 0.4, 0.35, 0.8]) >>> import pdb >>> pdb.set_trace() (Pdb) b roc_auc_score Breakpoint 1 at /usr/local/lib/python3.5/dist-packages/sklearn/metrics/ranking.py:244 (Pdb) roc_auc_score(y_true, y_scores)
问题的根源
当你用from ... import ...直接导入函数时,pdb的b roc_auc_score虽然显示了断点位置,但实际执行时,当前命名空间的函数引用和模块内部的函数定义关联不够紧密,导致断点没有被正确触发。
两种可行的解决方法
方法1:使用完整的模块函数路径设置断点
在pdb提示符中,直接指定函数的完整限定名,让pdb精准定位到sklearn模块内部的函数定义:
(Pdb) b sklearn.metrics.ranking.roc_auc_score
设置好这个断点后,再调用roc_auc_score(y_true, y_scores),程序就会在目标位置中断了。
方法2:通过文件路径+行号设置断点
如果你已经知道函数所在的文件和行号(比如你看到的244行),可以直接用文件路径加行号来设置断点:
(Pdb) b /usr/local/lib/python3.5/dist-packages/sklearn/metrics/ranking.py:244
要是不确定文件路径,也可以先在pdb里打印函数的文件属性来确认:
(Pdb) print(roc_auc_score.__code__.co_filename)
输出的结果就是该函数对应的文件路径,用这个路径加行号设置断点就不会出错了。
验证效果
设置好正确的断点后,再次调用roc_auc_score(y_true, y_scores),程序就会在ranking.py的目标行停下来,你就能查看函数内部的变量值了。
内容的提问来源于stack exchange,提问作者user2524314
相关产品推荐
相关产品推荐

