从Python调用堆栈获取行号等信息
时间:2022-07-26
本文章向大家介绍从Python调用堆栈获取行号等信息,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
程序中的日志打印,或者消息上传,比如kafka消息等等。经常上传的消息中需要上传堆栈信息中的文件名、行号、上层调用者等具体用于定位的消息。Python提供了以下两种方法:
-
sys._getframe
, 基础方法 -
inspect.currentframe
, 推荐方法,提供除了sys._getframe
方法之外更多的frame相关的方法
具体使用如下
使用sys._getframe
私有方法
具体使用方法如下:
import os
import sys
def get_cur_info():
"""
获取调用时的文件名,行号,上层调用者的名称
:return: 文件名,行号,上层调用者名称
"""
try:
current_frame = sys._getframe(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'
具体的函数输出结果演示可以参见下面的inspect模块结果
使用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方法的使用见帮助文档
>>> help(inspect.currentframe)
Help on built-in function _getframe in module sys:
_getframe(...)
_getframe([depth]) -> frameobject
Return a frame object from the call stack. If optional integer depth is
given, return the frame object that many calls below the top of the stack.
If that is deeper than the call stack, ValueError is raised. The default
for depth is zero, returning the frame at the top of the call stack.
This function should be used for internal and specialized
purposes only.
从调用堆栈返回一个帧对象。深度为整数,默认为0,返回调用堆栈顶部的帧。如果指定深度比调用堆栈深,会抛出ValueError异常。该功能应该只用于内部和专业目的。
inspect.currentframe方法的实现见内置库inspect.py
if hasattr(sys, '_getframe'):
currentframe = sys._getframe
else:
currentframe = lambda _=None: None
所以本质上inspect.currentframe方法等同于sys._getframe方法
currentframe = lambda _=None: None 等同于 currentframe = lambda _: None ,即lambda函数接收一个参数,返回None
参考:
- ASP.NET MVC的Action Filter
- Android LayoutInflater详解
- 在Android中实现service动态更新UI界面
- VUE 入门基础(5)
- Android的UI设计与后台线程交互
- 更强悍的Silverlight: WCF RIA Services
- Java究竟该怎么学?文末有彩蛋!
- python-IDLE清屏和标记行数,其他推荐
- 从0到1:PostCSS 插件开发最佳实践
- VUE 入门基础(4)
- 实例演示Android异步加载图片
- 使用OData协议查询Windows日志
- Android之Notification介绍
- postcss-lazysprite: 一种生成CSS 雪碧图的懒惰姿势
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- springmvc之使用POJO作为参数
- 【猫狗数据集】利用tensorboard可视化训练和测试过程
- springmvc之视图解析流程
- 【猫狗数据集】从命令行接收参数
- django-URL重定向(八)
- Jetpack新成员,App Startup一篇就懂
- python之利用魔术方法实现自己定义的二维向量
- 【猫狗数据集】使用top1和top5准确率衡量模型
- django-URL反向解析Reverse(九)
- spring之如何在web应用中使用?
- 【猫狗数据集】使用预训练的resnet18模型
- django-URL应用命名空间(十)
- 【colab pytorch】模型权重初始化
- 【colab pytorch】提取模型中的某一层
- django-URL实例命名空间(十一)