从Python调用堆栈获取行号等信息

从Python调用堆栈获取行号等信息

程序中的日志打印,或者消息上传,比如kafka消息等等。经常上传的消息中需要上传堆栈信息中的文件名、行号、上层调用者等具体用于定位的消息。Python提供了以下两种方法:

  • sys._getframe, 基础方法
  • inspect.currentframe, 推荐方法,提供除了sys._getframe方法之外更多的frame相关的方法

具体使用如下
使用sys._getframe私有方法

import os
import sys
import sys._getframe
def do_exe():
print sys._getframe().f_code.co_filename #当前文件名,可以通过__file__获得. getframe()方法的参数默认为0
print sys._getframe(0).f_lineno #当前行号
print sys._getframe(0).f_code.co_name #当前函数名
print sys._getframe(1).f_code.co_name #调用该函数的函数的名字
print sys._getframe(2).f_code.co_name #调用上一个函数的调用者
def exe():
do_exe()

使用inspect模块(推荐)

相比于sys的内置私有方法,更推荐inspect模块。inspect模块的具体使用方法如下

import os
import inspect
def get_cur_info():
try:
current_frame = inspect.currentframe(2)
return os.path.basename(current_frame.f_code.co_filename), current_frame.f_lineno,current_frame.f_code.co_name
except ValueError:
return 'unknown', 0, 'unknown'
def produce():
return get_cur_info()
def business():
return produce()
if __name__ == '__main__':
print(get_cur_info()) # 输出 ('unknown', 0, 'unknown')
print(produce()) # 输出 ('a.py', 22, '<module>')
print(business()) # 输出 ('a.py', 16, 'business')

主要依赖inspect.currentframe方法,关于inspect.currentframe方法的使用见帮助文档

从调用堆栈返回一个帧对象。深度为整数,默认为0,返回调用堆栈顶部的帧。如果指定深度比调用堆栈深,会抛出ValueError异常。该功能应该只用于内部和专业目的。

inspect.currentframe方法的实现见内置库inspect.py
所以本质上inspect.currentframe方法等同于sys._getframe方法

参考文档:
https://docs.python.org/zh-tw/3/library/inspect.html

posted @   michaelchengjl  阅读(274)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
历史上的今天:
2021-05-27 C语言_宏
点击右上角即可分享
微信分享提示