Get __name__ of calling function's module in Python

Suppose myapp/foo.py contains:

def info(msg):
caller_name = ????
print '[%s] %s' % (caller_name, msg)

And myapp/bar.py contains:

import foo
foo.info('Hello') # => [myapp.bar] Hello

I want caller_name to be set to the __name__ attribute of the calling functions' module (which is 'myapp.foo') in this case. How can this be done?

72643 次浏览

检查检查模块:

inspect.stack()将返回堆栈信息。

Inside a function, inspect.stack()[1] will return your caller's stack. From there, you can get more information about the caller's function name, module, etc.

详情请参阅文件:

Http://docs.python.org/library/inspect.html

此外,Doug Hellmann 在他的 PyMOTW 系列中对检查模块有一个很好的描述:

Http://pymotw.com/2/inspect/index.html#module-inspect

编辑: 这里有一些代码可以做你想做的事情,我想:

import inspect


def info(msg):
frm = inspect.stack()[1]
mod = inspect.getmodule(frm[0])
print '[%s] %s' % (mod.__name__, msg)

我不建议你这样做,但是你可以通过以下方法来实现你的目标:

def caller_name():
frame=inspect.currentframe()
frame=frame.f_back.f_back
code=frame.f_code
return code.co_filename

然后更新你现有的方法如下:

def info(msg):
caller = caller_name()
print '[%s] %s' % (caller, msg)

面对类似的问题,我发现 sys 模块中的 Sys _ current _ Frame ()包含有趣的信息,这些信息可以帮助您,无需导入检查,至少在特定的用例中是这样的。

>>> sys._current_frames()
{4052: <frame object at 0x03200C98>}

You can then "move up" using f_back :

>>> f = sys._current_frames().values()[0]
>>> # for python3: f = list(sys._current_frames().values())[0]


>>> print f.f_back.f_globals['__file__']
'/base/data/home/apps/apricot/1.6456165165151/caller.py'


>>> print f.f_back.f_globals['__name__']
'__main__'

对于文件名,也可以使用 f.f _ back。F _ code.Co _ filename,由上面的 Mark Roddy 建议。我不确定这个方法的限制和注意事项(多线程很可能是一个问题) ,但我打算在我的案例中使用它。

对于我来说,只要按下一行就可以知道来电者的名字。

import inspect
frame = inspect.stack()[-1]
print(frame.filename)