我在python中有一个模块,并且基于调用了函数的脚本,我想在该模块中做出决定。
因此,如果我们有2个文件file1.py
和file2.py
,则导入模块testmod并调用其中的函数。在模块testmod中,我想知道哪个脚本调用了它? file1.py
或file2.py
。
我想在testmod中编写如下代码 如果那么 做这个 如果那么 去做 其他 做点什么!
答案 0 :(得分:1)
我发布了一个用于检查的包装器,其中简单的堆栈帧寻址通过单个参数spos覆盖堆栈帧,这些都是名称所特有的:
PySourceInfo.getCallerModuleFilePathName
PySourceInfo.getCallerModuleName
请参阅:
答案 1 :(得分:0)
查看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()
输出相同。