如何禁用Python栈跟踪中的脱字符(^)?
解决Python 3.12栈跟踪中脱字符导致脚本异常的问题
问题重现
我有个测试读数脚本在Python 3.9跑完全正常,但升级到3.12后,栈跟踪里冒出来的一串^^^^^^^^^^^^^^^^^^^^直接搞崩了脚本。举个例子,报错信息长这样:
ERROR: test_email (tests.test_emails.EmailTestCase.test_email)
Traceback (most recent call last):
File "/my-project/email/tests/test_emails.py", line 72, in test_email
self.assertNotEquals(self.email.id, self.email_id)
^^^^^^^^^^^^^^^^^^^^
两种解决办法
1. 用环境变量直接禁用
Python 3.12新增了PYTHONNODEBUGRANGES环境变量,设置为1就能关掉这个脱字符标记:
- 运行脚本前临时设置:
PYTHONNODEBUGRANGES=1 python your_test_script.py
- 或者在脚本开头加这段代码,永久生效:
import os os.environ['PYTHONNODEBUGRANGES'] = '1'
2. 自定义过滤逻辑(适合unittest场景)
如果你的脚本是基于unittest的,也可以自己写个测试结果处理器,把栈跟踪里的脱字符行过滤掉:
import unittest import traceback class CustomTestResult(unittest.TextTestResult): def addError(self, test, err): tb_lines = traceback.format_exception(*err) # 把所有脱字符开头的行筛掉 filtered_tb = [line for line in tb_lines if not line.strip().startswith('^^^^^^^^^^^^^^^^^^^^')] self.errors.append((test, ''.join(filtered_tb))) self._mirrorOutput = True class CustomTestRunner(unittest.TextTestRunner): def _makeResult(self): return CustomTestResult(self.stream, self.descriptions, self.verbosity) if __name__ == '__main__': unittest.main(testRunner=CustomTestRunner())
补充说明
Python 3.12加这个脱字符是为了更清楚地标出出错的代码位置,本质是依赖调试范围信息。PYTHONNODEBUGRANGES会让Python不生成这些信息,自然就不会输出脱字符;如果没法用环境变量,自定义过滤就是在输出前手动清理掉这些标记行。
内容的提问来源于stack exchange,提问作者claudius
相关产品推荐
相关产品推荐

