在VSCode/Jupyter中动态调试pip安装的外部Python模块(以transformers为例)的方法咨询
嘿,我完全懂你这种想灵活调试第三方库的需求——手动改site-packages里的代码太麻烦,还容易忘改回去。下面给你几个实用的解决方案,亲测有效:
不管是用原生的pdb还是可视化调试工具(VS Code、PyCharm),都能直接在运行时给外部库的代码加断点,根本不用碰site-packages里的文件。
比如用原生pdb的操作方式:
import pdb from transformers import AutoModel # 先进入pdb调试模式 pdb.set_trace() # 接下来执行库代码时,就能在pdb里动态加断点 model = AutoModel.from_pretrained("bert-base-uncased")
进入pdb后,你可以用类似b transformers.models.bert.modeling_bert.BertModel.__init__的命令,直接给指定类/方法加断点;如果知道具体源码文件的行号,也可以用b /path/to/transformers/modeling_bert.py:1234来定位。
如果用VS Code就更简单了:
- 打开你的
test.py,在调用库的行设置断点,启动调试 - 当程序运行到库内部代码时,直接点击左侧行号就能添加断点,后续调试和自己写的代码完全一样,还能随时移除断点。
这个方法相当于把pip安装的库替换成你本地克隆的版本,之后就能像调试自己的模块一样随意修改、加断点,修改后立即生效:
- 先把transformers库克隆到本地:
git clone https://github.com/huggingface/transformers.git
- 进入克隆的目录,用可编辑模式安装:
pip install -e .
这一步会让pip把site-packages里的transformers链接指向你本地的克隆目录,而不是原来的静态安装文件。
3. 现在你可以直接在本地克隆的代码里加断点、改逻辑,不管是普通Python脚本还是Jupyter,修改后都不需要重新安装,直接运行就能生效。
你之前用的%autoreload 2默认只监控你自己的脚本文件,对site-packages里的库不生效。要让它监控外部库,需要额外配置:
# 先加载autoreload扩展 %load_ext autoreload # 设置自动重载级别,同时指定要监控的外部库 %autoreload 2 %aimport transformers
这样一来,当你修改本地克隆的transformers代码(必须是可编辑模式安装的哦),Jupyter会自动重新加载模块,新添加的breakpoint()也会立即生效。
如果你不想克隆库或者改调试器设置,还可以用inspect模块动态修改库函数的源码,插入断点:
import inspect from transformers import BertModel # 获取BertModel初始化方法的源码 src_code = inspect.getsource(BertModel.__init__) # 在源码开头插入breakpoint() modified_code = src_code.replace("def __init__(", "def __init__(\n breakpoint(),") # 重新编译执行修改后的代码 exec(modified_code, globals())
不过这个方法比较hack,适合临时调试一两处代码,稳定性不如前面两种方法,不推荐长期用。
内容的提问来源于stack exchange,提问作者sachinruk

