暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Python 在函数内部获取函数名称,所处模块,被调用时所在模块代码行

授客的知识库 2021-09-10
4191

代码实践

module2.py:

#!/usr/bin/env python
# -*- coding:utf-8 -*-


__author__ = 'shouke'

import sys
import os
import traceback

def get_cur_info():
# 获取函数名称
print('函数名称:', sys._getframe().f_code.co_name)

# 获取函数所在模块文件名
print('获取函数所在模块文件名:', sys._getframe().f_code.co_filename)

result = traceback.extract_stack()
caller = result[len(result)-2]

# 获取调用函数的模块文件绝对路径
file_path_of_caller = str(caller).split(',')[0].lstrip('<FrameSummary file ')
print('调用函数的模块文件绝对路径:', file_path_of_caller)

# 调用函数的模块文件名
file_name_of_caller = os.path.basename(file_path_of_caller) # 获取被调用函数所在模块文件名称
print('调用函数的模块文件名:', file_name_of_caller)

# 获取函数被调用时所处模块的代码行
# 方法1
print('函数被调用时所处模块的代码行:', sys._getframe().f_back.f_lineno)

# 方法2
code_line_when_called = sys._getframe().f_back.f_lineno
print('函数在被调用时所处代码行数:',code_line_when_called)


module1.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-


__author__ = 'shouke'

from study1 import get_cur_info

get_cur_info()

结果:

使用场景

设置配置文件路径

思路:获取被调用函数所在模块文件名,然后获取其路径,同配置文件所在路径比较,这样基于模块文件路径、父级路径,可知配置文件所在的相对路径,这样不管当前工作目录在哪里,都可以获取到配置文件的绝对路径。

例子:设置配置文件路径为“相对路径”

log.py中原代码:

#……其它略

logsignleton = LogSignleton('./conf/log.conf')
logger = logsignleton.get_logger()

按上述方式编写代码,存在问题,当进入到plugin目录,并执行pluginfunc.py时,会提示找不到LOGGING session,也就是说找不到log.conf,解决方式,修改log.py如下:

co_filepath = sys._getframe().f_code.co_filename
head, tail = os.path.split(co_filepath)

conf_filepath = os.path.join(head, '../conf/log.conf')
conf_filepath = os.path.normpath(conf_filepath)

logsignleton = LogSignleton(conf_filepath)
logger = logsignleton.get_logger()

当然,我们也可以在模块中通过 __file__
获取logg.py自身文件的绝对路径,如下:

head, tail = os.path.split(os.path.abspath(__file__))


文章转载自授客的知识库,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论