You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何禁用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 11:21:11