ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2022-05-27 15:35:29  阅读:203  来源: 互联网

标签:__ getframe Python inspect print sys 行号 ._ 堆栈


从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

标签:__,getframe,Python,inspect,print,sys,行号,._,堆栈
来源: https://www.cnblogs.com/michaelcjl/p/16317791.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有