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

traceback.print_stack()获取帧输入参数的正确方法 避免使用sys._getframe

解决方案

你可以用以下两种标准库公开API实现需求,完全避免调用sys._getframe这类受保护方法:

方案1:使用inspect.currentframe获取栈帧(最接近原有实现)

inspect.currentframe是Python官方公开的栈帧获取接口,和sys._getframe功能等价,不会触发IDE警告。你只需要修改on_error函数如下:

import os
import pathlib
import sys
import traceback
import inspect # 新增导入


def main():
  path = pathlib.Path('/foo')
  content_bytes = b''
  my_func(path, content_bytes)

def my_func(path, content_bytes):
  for (dirpath, dirnames, filenames) in os.walk(path, onerror=on_error(path)):
    for filename in filenames:
      file: bytes = open(dirpath + "/" + filename, "rb").read()
      content_bytes += file

def on_error(path):
  # 取当前帧的上一层帧,完全等价于原有sys._getframe(1)的效果
  caller_frame = inspect.currentframe().f_back
  traceback.print_stack(caller_frame)
  print("path is not a dir path supplied: {}".format(path))

main()

运行后输出和你原有实现完全一致。

方案2:直接调整栈打印的层数(无需操作栈帧对象)

如果不想和栈帧对象直接交互,可以直接用traceback模块自带的切片能力,过滤掉不需要的栈层:

def on_error(path):
  # 去掉最后1层栈(就是当前on_error函数内的执行栈),输出和原效果一致
  stacks = traceback.extract_stack()[:-1]
  print(''.join(traceback.format_list(stacks)))
  print("path is not a dir path supplied: {}".format(path))

这个方案兼容性更强,不需要依赖平台对栈帧对象的支持。


你之前查的sys.exc_info()相关方案确实不适用你的场景:这类方案需要有实际异常抛出才能拿到栈信息,而你是在无异常的场景下主动打印调用栈,自然返回的都是None。

内容的提问来源于stack exchange,提问作者topher217

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 04:45:01