从Python调用堆栈获取行号等信息
2022/5/28 1:24:12
本文主要是介绍从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
这篇关于从Python调用堆栈获取行号等信息的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-25Python编程基础:变量与类型
- 2024-11-25Python编程基础与实践
- 2024-11-24Python编程基础详解
- 2024-11-21Python编程基础教程
- 2024-11-20Python编程基础与实践
- 2024-11-20Python编程基础与高级应用
- 2024-11-19Python 基础编程教程
- 2024-11-19Python基础入门教程
- 2024-11-17在FastAPI项目中添加一个生产级别的数据库——本地环境搭建指南
- 2024-11-16`PyMuPDF4LLM`:提取PDF数据的神器