如何在PyCharm的Python环境中获取不含site-packages的简化stacktrace
Python+PyCharm场景下过滤site-packages栈追踪的实现方案
PyCharm原生JustMyCode配置(调试场景最优解)
PyCharm本身已经内置了完整的JustMyCode功能,无需额外编写代码,按以下步骤开启即可:
- 打开PyCharm
设置(Settings)面板,依次进入构建、执行、部署(Build, Execution, Deployment)→Python调试器(Python Debugger) - 勾选页面中的
启用Just My Code选项,默认规则会自动过滤所有标准库、site-packages路径下的栈帧,调试时抛出的异常栈只会展示你自己编写的项目代码轨迹 - 如果你有自定义的第三方路径需要额外过滤,可以在下方的
框架排除列表(Frame Skipping)中手动添加路径匹配规则
代码层面全局过滤方案(非调试运行场景)
如果需要在非调试模式、日志打印等场景也输出过滤后的栈追踪,可以通过重写sys.excepthook实现全局生效的过滤逻辑,以下是可直接复用的实现:
import sys import os from traceback import extract_tb, format_list # 配置项:替换为你自己的项目根目录绝对路径 PROJECT_ROOT = os.path.abspath(os.getcwd()) # 自动识别系统的site-packages、标准库路径 SITE_PACKAGES_PATHS = [p for p in sys.path if 'site-packages' in p or 'dist-packages' in p] STD_LIB_PATH = os.path.dirname(os.__file__) def just_my_code_excepthook(exc_type, exc_value, exc_traceback): # 提取原始栈帧 raw_frames = extract_tb(exc_traceback) # 过滤非项目代码的栈帧 filtered_frames = [] for frame in raw_frames: frame_abs_path = os.path.abspath(frame.filename) # 仅保留项目根目录下、且不属于标准库/第三方库的栈帧 if frame_abs_path.startswith(PROJECT_ROOT) \ and not any(frame_abs_path.startswith(p) for p in SITE_PACKAGES_PATHS) \ and not frame_abs_path.startswith(STD_LIB_PATH): filtered_frames.append(frame) # 格式化输出过滤后的栈追踪 print("Traceback (most recent call last, JustMyCode filtered):", file=sys.stderr) for line in format_list(filtered_frames): print(line, end="", file=sys.stderr) print(f"{exc_type.__name__}: {exc_value}", file=sys.stderr) # 替换全局异常处理钩子,所有未捕获异常都会走过滤逻辑 sys.excepthook = just_my_code_excepthook
- 如果需要适配日志打印场景,可以把上述过滤逻辑集成到
logging模块的异常格式化器中,打exception级别日志时自动输出过滤后的栈 - 可根据自己的业务需求调整过滤规则,比如添加需要额外排除的私有依赖路径
第三方成熟工具方案
你可以直接使用better-exceptions库,它自带栈过滤、彩色输出、异常上下文变量展示等增强功能,安装后只需配置环境变量BETTER_EXCEPTIONS_SUPPRESS_MODULES=site-packages即可自动过滤所有第三方库的栈帧,完全兼容PyCharm运行/调试场景。
内容的提问来源于stack exchange,提问作者liormayn
相关产品推荐
相关产品推荐

