python查看函数的调用堆栈,记录调用信息

需求:
程序运行过程中,要把某个功能调用的函数,函数中的代码,以及注释说明记录下来输出到log中,有什么内置模块或者第三方模块可以实现呢?

网上查找了以下,找到了想要的答案,记录下来方便日后查看

思路:

1、用inspect模块

2、用sys._getframe模块

先说下sys._getframe模块的用法:

用该模块主要是查看函数被什么函数调用以及被第几行调用及被调用函数所在文件

import sys
def get_cur_info():
    print(sys._getframe().f_code.co_filename)  # 当前文件名,可以通过__file__获得
    print(sys._getframe(0).f_code.co_name) # 当前函数名
    print(sys._getframe(1).f_code.co_name)  # 调用该函数的函数名字,如果没有被调用,则返回<module>
    print(sys._getframe(0).f_lineno) #当前函数的行号
    print(sys._getframe(1).f_lineno) # 调用该函数的行号

生产环境可以将print用logging模块代替

再说下inspect模块的用法:

inspect 模块提供了一些有用的函数帮助获取对象的信息,例如模块、类、方法、函数、回溯、帧对象以及代码对象。

深度学习了解可以查看官方文档:https://docs.python.org/zh-cn/3.7/library/inspect.html

import inspect
def debug():
    callnamer = inspect.stack()
    print('[debug] enter: {}'.format(callnamer))

debug()

># 返回一个列表
> [debug] enter:
>  [
>     FrameInfo(frame=<frame object at 0x000000000096D448>, 
>     filename='E:/pythontest/sort.py', lineno=6, function='debug',
>     code_context=[' callnamer = inspect.stack()\n'], index=0),
>     FrameInfo(frame=<frame object at 0x00000000008F8828>, filename='E:/pythontest/sort.py',lineno=9,function='<module>', 
>     code_context=['debug()\n'], index=0)
>  ]

> #选取列表的第二项
> import inspect
> 
> def debug():
>     callnamer = inspect.stack()[1]
>     print('[debug] enter: {}'.format(callnamer))
> 
>   debug()
> 
> [debug] enter: 
> FrameInfo(frame=<frame object at 0x00000000004A8828>, filename='E:/pythontest/sort.py', 
>            lineno=9, function='<module>', code_context=['debug()\n'], index=0
>           )
> 
> # 选取函数的名字
> 
> import inspect
> 
>  def debug():
>     callnamer = inspect.stack()[1][4]
>     print('[debug] enter: {}'.format(callnamer))

debug()

> [debug] enter: ['debug()\n']

inspect模块还提供了来自命令行的基本自省功能。

默认情况下,接受模块的名称并打印该模块的源代码。模块中的类或函数可以通过附加冒号和目标对象的限定名称来打印。

–details¶
打印有关指定对象的信息而不是源代码

更多信息可参考:

http://stackoverflow.com/questions/11799290/get-function-callers-information-in-python

http://stackoverflow.com/questions/900392/getting-the-caller-function-name-inside-another-function-in-python

http://stackoverflow.com/questions/17065086/how-to-get-the-caller-class-name-inside-a-function-of-another-class-in-python

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值