如何在运行时从模块内部了解哪个脚本在其中调用了一个函数

时间:2012-10-17 09:12:18

标签: python module trace inspect

我在python中有一个模块,并且基于调用了函数的脚本,我想在该模块中做出决定。

因此,如果我们有2个文件file1.pyfile2.py,则导入模块testmod并调用其中的函数。在模块testmod中,我想知道哪个脚本调用了它? file1.pyfile2.py

我想在testmod中编写如下代码 如果那么    做这个 如果那么    去做 其他    做点什么!

3 个答案:

答案 0 :(得分:1)

我发布了一个用于检查的包装器,其中简单的堆栈帧寻址通过单个参数spos覆盖堆栈帧,这些都是名称所特有的:

  • PySourceInfo.getCallerModuleFilePathName
  • PySourceInfo.getCallerModuleName

请参阅:

答案 1 :(得分:0)

Traceback

查看traceback上的文档中是否有任何内容可以为您提供想法。

答案 2 :(得分:0)

正如评论中已经说明的那样,您可以避免这种情况(因为它设计糟糕并且使事情复杂化)向该函数添加参数。或者如果内部代码不时有很大不同,你可以编写这个函数的两个版本。

无论如何,如果你想知道调用函数的位置,你需要inspect模块。我不是它的专家,但我不认为获得调用该函数的堆栈框架并且从那里了解哪个脚本称为它就太难了。

更新

如果你真的想使用inspect做丑陋的事情,这里有一个最小的工作示例:

#file a.py

import inspect
def my_func():
    dad_name = inspect.stack()[1][1]
    if inspect.getmodulename(dad_name) == 'b':   #or whatever check on the filename
         print 'You are module b!'
    elif inspect.getmodulename(dad_name) == 'c':
         print 'You are module c!'
    else:
         print 'You are not b nor c!'

#file b.py
import a

a.my_func()

#file c.py

import a
a.my_func()

#file d.py
import a
a.my_func()

输出:

$ python b.py
You are module b!
$ python c.py
You are module c!
$ python d.py
You are not b nor c!

如果要在函数中添加参数:

#file a.py
def my_func(whichmod=None):
    if whichmod == 'b':
         print 'You are module b!'
    elif whichmod == 'c':
         print 'You are module c!'
    else:
         print 'You are not B nor C!'

#files b.py/c.py
import a
a.my_func(whichmod='b')   # or 'c' in module c

#file d.py
import a
a.my_func()

输出相同。