我在 python 中有一个模块,并且基于在其中调用函数的脚本,我想在该模块中做出决定。
因此,如果我们有 2 个文件file1.py
和file2.py
,则都导入模块 testmod 并在其中调用一个函数。在模块 testmod 中,我想知道哪个脚本调用了它?file1.py
或file2.py
。
我想在 testmod 中编写如下代码 if then do this else if then do that else do something else !
我发布了一个用于检查的包装器,它使用简单的堆栈帧寻址,通过单个参数 spos 覆盖堆栈帧,这些实现了名称所承诺的功能:
PySourceInfo.getCallerModuleFilePathName
PySourceInfo.getCallerModuleName
看:
看看文档中是否有任何内容traceback
可以为您提供想法。
正如评论中已经说明的那样,您可以避免这种情况(因为它是糟糕的设计并且会使事情变得很复杂)向该函数添加一个参数。或者,如果内部代码不时有很大差异,您可以编写此函数的两个版本。
无论如何,如果你想知道你的函数是从哪里调用的,你需要检查模块。我不是这方面的专家,但我认为获取调用该函数的堆栈帧并从那里了解哪个脚本调用它并不难。
更新:
如果您真的想使用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()
输出是一样的。