如何查找Python脚本执行过程中未被运行的代码行
排查Python脚本单次运行时未执行代码的方案
1. 首选方案:使用coverage.py统计代码覆盖率
这是Python生态中最成熟的代码覆盖率统计工具,完全匹配你需要的「单次运行过程中未执行代码识别+统计」需求:
- 安装命令:
pip install coverage - 替代原有启动命令运行你的脚本,执行时自动采集覆盖数据:
coverage run your_script.py [脚本的入参] - 直接查看命令行统计结果,包含每个文件的未执行行号列表、覆盖率占比:
coverage report -m - 如果需要可视化的标记结果,可生成网页版报告:执行
coverage html后打开生成的htmlcov/index.html,所有执行过的代码、未执行的代码会用不同颜色高亮显示,未执行行号直接标注在对应行旁。
这个方案的统计完全基于本次运行的实际执行路径,不会受静态检测误判的影响,动态调用的函数只要被执行就会被正常统计,未被调用的函数内部所有代码行都会被标记为未执行,比IDE的静态未使用变量检测准确度高很多。
2. 无第三方依赖的轻量实现方案
如果运行环境无法安装额外第三方库,可以直接用Python标准库的sys.settrace接口自定义实现行覆盖统计,示例代码如下:
import sys import inspect # 配置你要统计的目标脚本绝对路径,避免统计到标准库、第三方库代码 TARGET_SCRIPT_PATH = "/path/to/your_script.py" executed_lines = set() def trace_handler(frame, event, arg): if event == "line": frame_info = inspect.getframeinfo(frame) if frame_info.filename == TARGET_SCRIPT_PATH: executed_lines.add(frame.f_lineno) return trace_handler # 开启trace sys.settrace(trace_handler) # 运行你的目标脚本,和原有执行逻辑一致即可 import your_script # 关闭trace sys.settrace(None) # 统计目标脚本的所有有效代码行(排除空行、注释行) with open(TARGET_SCRIPT_PATH, "r", encoding="utf-8") as f: all_valid_lines = [] for line_num, line_content in enumerate(f.readlines(), start=1): stripped = line_content.strip() if stripped and not stripped.startswith("#"): all_valid_lines.append(line_num) # 计算未执行的行 unused_lines = sorted(set(all_valid_lines) - executed_lines) # 输出统计结果 print(f"=== 代码覆盖统计结果 ===") print(f"总有效代码行数:{len(all_valid_lines)}") print(f"本次运行执行行数:{len(executed_lines)}") print(f"未执行行数:{len(unused_lines)}") print(f"代码覆盖率:{(len(executed_lines)/len(all_valid_lines))*100:.2f}%") print(f"未执行行号列表:{unused_lines}")
这个方案可以根据你的需求自定义过滤规则,比如排除特定函数、特定目录的统计,灵活度更高,适合特殊场景使用。
注意事项
如果你的脚本涉及多进程、多线程运行,coverage.py原生支持这类场景的覆盖率统计,只需要在运行时添加对应配置即可,无需修改业务代码。
内容的提问来源于stack exchange,提问作者user10364768
相关产品推荐
相关产品推荐

