通过另一个函数获取函数名称和文件名

时间:2018-06-26 14:22:15

标签: python

我希望python向我显示已执行了哪个函数以及从哪个文件......因此,我将其作为test1.py

import sys,os, test2

def some_function():
    print (sys._getframe().f_code.co_name +" "+ os.path.basename(__file__) , 'executed')
    print (test2.function_details(), 'executed')

test2.py是:

import sys,os

def function_details():
    return sys._getframe().f_code.co_name + " " +os.path.basename(__file__)

现在我运行它

import test1

test1.some_function()

我得到以下输出:

('some_function test1.pyc', 'executed')
('function_details test2.pyc', 'executed')

当我尝试创建一个函数来调用执行的文件和函数时,它会告诉我我创建的子函数而不是原始的子函数。

我的问题是如何修改test2.py使其输出

('some_function test1.pyc', 'executed')
('some_function test1.pyc', 'executed')

1 个答案:

答案 0 :(得分:1)

CAST有两个问题:

  1. 当前帧为REPLACE,因此您需要向上移动一帧才能到达调用帧。为此,您将function_details传递给function_details
  2. 1是您碰巧所在的模块(如果定义)的当前文件名,需要用关联的sys._getframe对象的__file__属性替换框架正确。

更正了这两件事,我们将function_details重新定义为:

co_filename

将产生所需的结果。我认为,f_code模块完成同一件事远比直接使用def function_details(): code_obj = sys._getframe(1).f_code return " ".join([code_obj.co_name, os.path.basename(code_obj.co_filename)]) 好。这是使用inspect编写的新function_details:

inspect