如何动态调试Python的第三方库
2017-01-21 22:53
274 查看
注意:本文方法仅限于调试安装时附带py源码的库,如
那么问题来了,我们怎么样才能动态调试Python的第三方库(比如
假设我的代码如下:
我怎么样才能看到函数
下面两行代码就能给程序加断点:
加了断点,运行程序,当程序停下,就可以用下面几个命令,在SHELL中调试代码。
(1)找到第三方库所在的位置
先利用如下Python代码找到
(2)删掉Python预编译的
Python程序在运行时,为了提高运行速度,Python解释器先将
下次再运行同一程序时,若
这些
(3)在第三方库源码中加断点
根据第三方库的位置,找到
(4)运行自己的程序
运行我的代码,停在第三方库中,就可以用pdb命令调试第三方代码了。
此时代码已经运行并进入第三方库中,停止在断点处:
C:\mine\tmp\debug_py_3rd_lib>python main.py
c:\users\biny\anaconda3\lib\site-packages\sklearn\feature_extraction\text.py(1018)transform()
-> if hasattr(X, ‘dtype’) and np.issubdtype(X.dtype, np.float):
(Pdb)
用n命令(next),让代码单步运行到关键点:
c:\users\biny\anaconda3\lib\site-packages\sklearn\feature_extraction\text.py(1042)transform()
-> if self.norm:
(Pdb) n
直接输入要查看的中间变量(X.data),停下的这行代码是即将执行的,我们可以看到执行前的变量值:
c:\users\biny\anaconda3\lib\site-packages\sklearn\feature_extraction\text.py(1043)transform()
-> X = normalize(X, norm=self.norm, copy=False)
(Pdb) X.data
array([ 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
继续执行代码(n命令),然后可以看到中间变量值被改变。也能看到这个改变是因为做了
(Pdb) n
c:\users\biny\anaconda3\lib\site-packages\sklearn\feature_extraction\text.py(1045)transform()
-> return X
(Pdb) X.data
array([ 0.57735027, 0.57735027, 0.57735027, 0.40824829, 0.40824829,
0.40824829, 0.40824829, 0.40824829, 0.40824829, 0.5 ,
0.5 , 0.5 , 0.5 ])
记住调试结束后,一定要在第三方源码中删掉pdb断点那两行代码!
sklearn。
引入
用sklearn中的
sklearn.feature_extraction.text.TfidfTransformer来获取
TF特征,但发现
sklearn的计算结果与我手工计算结果不一样。虽然能在github上找到
sklearn的源码。但不能动态调试,就无法直观的看到结果。
那么问题来了,我们怎么样才能动态调试Python的第三方库(比如
sklearn)呢?怎么样才能看到第三方库中源码动态运行的中间结果?
假设我的代码如下:
# 原始语料,3个文本 strs_train =[ 'God is love', 'OpenGL on the GPU is fast', 'Doctor David is PHD'] from sklearn.feature_extraction.text import TfidfTransformer from sklearn.feature_extraction.text import CountVectorizer # 先提取 Bags of words特征 count_vect = CountVectorizer() X_train_counts = count_vect.fit_transform(strs_train) # 再基于Bags of words特征,变换为TF特征 tf_transformer = TfidfTransformer(use_idf=False).fit(X_train_counts) X_train_tf = tf_transformer.transform(X_train_counts) print(X_train_tf.todense())
我怎么样才能看到函数
sklearn.feature_extraction.text.TfidfTransformer.transform()计算的中间结果呢?
Python调试基础
Python自带了一个用于调试代码的模块
pdb。它支持断点设置,单步调试,进入函数调试,查看代码片段,查看变量值,动态改变变量值。
下面两行代码就能给程序加断点:
import pdb pdb.set_trace()
加了断点,运行程序,当程序停下,就可以用下面几个命令,在SHELL中调试代码。
命令 | 含义 |
---|---|
c | 继续执行代码 |
n | 下一步 |
r | 执行代码,从当前函数返回 |
s | 进入函数 |
b | 下断点 |
调试Python第三方库
我们用pdb,就可以在第三方库中下断点,并进行调试。这里以调试
sklearn中的
sklearn.feature_extraction.text.TfidfTransformer为例,给出如下步骤。
(1)找到第三方库所在的位置
先利用如下Python代码找到
sklearn源码位置。我的位置在
C:\\Users\\biny\\Anaconda3\\lib\\site-packages\\sklearn。
import sklearn, os path = os.path.dirname(sklearn.__file__)
(2)删掉Python预编译的
字节码
Python程序在运行时,为了提高运行速度,Python解释器先将
.py代码编译为
byte code(
字节码),再有
Python虚拟机来执行字节码。
下次再运行同一程序时,若
.py代码没有改变,则省略将
.py代码编译为
字节码的步骤,直接运行上次已编译好的
字节码。
这些
字节码,会被存于
__pycache__文件夹下,和
.pyc文件。按照原理,这个步骤是不需要做的,不过删掉字节码在运行自己的程序,如果不会出现新的字节码文件,说明你的第三方库位置找错了。这样能方便我们发现错误。
(3)在第三方库源码中加断点
根据第三方库的位置,找到
sklearn.feature_extraction.text.TfidfTransformer.transform()函数所在
.py文件。并用
pdb在函数开头加上断点(如下)。
def transform(self, X, copy=True):
import pdb pdb.set_trace()
if hasattr(X, 'dtype') and np.issubdtype(X.dtype, np.float):
# preserve float family dtype
X = sp.csr_matrix(X, copy=copy)
else:
# convert counts or binary occurrences to floats
X = sp.csr_matrix(X, dtype=np.float64, copy=copy)
(4)运行自己的程序
运行我的代码,停在第三方库中,就可以用pdb命令调试第三方代码了。
此时代码已经运行并进入第三方库中,停止在断点处:
C:\mine\tmp\debug_py_3rd_lib>python main.py
c:\users\biny\anaconda3\lib\site-packages\sklearn\feature_extraction\text.py(1018)transform()
-> if hasattr(X, ‘dtype’) and np.issubdtype(X.dtype, np.float):
(Pdb)
用n命令(next),让代码单步运行到关键点:
c:\users\biny\anaconda3\lib\site-packages\sklearn\feature_extraction\text.py(1042)transform()
-> if self.norm:
(Pdb) n
直接输入要查看的中间变量(X.data),停下的这行代码是即将执行的,我们可以看到执行前的变量值:
c:\users\biny\anaconda3\lib\site-packages\sklearn\feature_extraction\text.py(1043)transform()
-> X = normalize(X, norm=self.norm, copy=False)
(Pdb) X.data
array([ 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
继续执行代码(n命令),然后可以看到中间变量值被改变。也能看到这个改变是因为做了
normalize。
(Pdb) n
c:\users\biny\anaconda3\lib\site-packages\sklearn\feature_extraction\text.py(1045)transform()
-> return X
(Pdb) X.data
array([ 0.57735027, 0.57735027, 0.57735027, 0.40824829, 0.40824829,
0.40824829, 0.40824829, 0.40824829, 0.40824829, 0.5 ,
0.5 , 0.5 , 0.5 ])
记住调试结束后,一定要在第三方源码中删掉pdb断点那两行代码!
参考
(1)python调试。http://www.ibm.com/developerworks/cn/linux/l-cn-pythondebugger/相关文章推荐
- BeautifulSoup笔记
- python类学习笔记
- python csv读写
- Python轻松入门-02 数字
- python requests笔记
- python初学二 条件语句
- 使用easy_install安装和卸载python扩展包
- Windows同时安装Python2和Python3
- XART------generate art ascii texts.
- [转]python pickle模块
- [转]python数据持久存储:pickle模块的基本使用
- python kivy windows 安装记录
- python yield generator 详解
- 利用Python 进行数据分析 ch02
- Python学习记录-2016-01-21
- python+testlink+jenkins集成测试自动化
- python应用 (1) 解析xml
- python使用@property
- python写的多进程并发测试框架
- python学习 第三章 使用字符串 《python基础教程第二版修订版》