使用pdb调试/lib/python3.7/site-packages下Python库断点不生效问题
调试site-packages库pdb断点未生效的常见原因
- Python加载的库不是你修改的版本
系统中可能存在多个Python版本或虚拟环境,运行主代码时调用的是其他路径下的同名库,而非你修改的/lib/python3.7/site-packages路径下的版本。可以在主代码开头添加如下代码验证实际加载的库路径:
确认输出路径和你修改的文件路径是否一致。import 你调试的库名 print(你调试的库名.__file__) - 断点添加的位置没有被执行到
你加断点的代码分支在本次运行中没有被触发,比如条件判断的分支、仅在特定参数下才会调用的函数、或者类/函数的定义段(只有定义被执行时才会触发断点,运行时调用定义好的函数不会触发定义段的断点)。 - 代码被预编译为pyc文件缓存
Python运行时优先加载.pyc预编译缓存文件,如果你修改.py文件后没有更新对应的.pyc,程序运行时还是用的旧版没有断点的代码。可以删除该库目录下所有__pycache__文件夹和.pyc文件后再重新运行。 - 运行时使用了优化模式
当你用python -O或者python -OO参数启动脚本时,Python会进入优化模式,会移除代码中所有assert语句,同时也会跳过breakpoint()(Python3.7+内置断点函数)的执行,如果你用的是import pdb;pdb.set_trace()的话优化模式下仍会生效,使用breakpoint()的话就会被跳过。 - 库代码被打包为.so/.pyd等二进制文件
部分Python库虽然核心逻辑是Python写的,但是发布时会被打包为二进制扩展文件,你看到的.py文件只是占位的存根文件,修改存根文件不会实际影响运行的代码,自然断点不会触发。 - 运行时调整了模块加载优先级
如果主代码运行时指定了其他库路径优先级高于系统site-packages,或者在代码开头把其他包含同名库的路径加到了sys.path的最前面,会优先加载其他路径下的库,不会用到你修改的版本。
内容的提问来源于stack exchange,提问作者eng2019
相关产品推荐
相关产品推荐

