如何动态调试Python的第三方库

本文详细介绍了如何使用Python的pdb模块动态调试第三方库,包括查找库源码位置、删除预编译的.pyc文件、设置断点及运行程序进行调试的方法,以sklearn库为例,展示了调试过程。
摘要由CSDN通过智能技术生成
如何动态调试Python的第三方库

注意:本文方法仅限于调试安装时附带py源码的库,如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__)
  • 1
  • 2
  • (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断点那两行代码!

参考

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python第三方库不支持Windows操作系统时,可以采取以下几种调试方法: 1. 查找替代库:首先,可以尝试搜索其他的第三方库,查看是否有兼容Windows的替代品。在Python开源社区中,许多库都有多个实现,找到与当前库功能相似且支持Windows的替代库可能是一种解决方法。 2. 检查库版本:确保库的版本是最新的,因为有些更旧的库版本可能不支持Windows。检查库的文档或GitHub页面,查看是否有关于Windows兼容性的信息,或者参考其问题跟踪记录中是否有类似的问题。 3. 安装相关依赖:有时第三方库在Windows下无法正常工作的原因是缺少相关依赖。可以通过确保安装了库所需的所有依赖项来解决此问题。一般情况下,在库的文档中都会提供依赖的清单,检查并确保所有依赖都已正确安装。 4. 调试代码:如果上述方法仍然无法解决问题,可以尝试对代码调试以找出具体的错误原因。可以使用Python自带的pdb模块行代码调试,通过在代码中插入断点并逐步执行来检查问题。 5. 向开发者寻求帮助:如果以上方法都无法解决问题,可以联系库的开发者寻求帮助。可以通过邮件、GitHub问题跟踪或库的社区论坛等方式与开发者沟通,向他们提供详细的错误信息和问题描述,希望他们能够提供解决方案或修复BUG。 总之,面对第三方库在Windows下不支持的问题,可以通过查找替代库、检查库版本、安装相关依赖、调试代码或向开发者寻求帮助等方式来解决问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值