1

我有四个文件 a.py、b.py、c.py 和 d.py。d.py 中的每个文件访问方法

import d
a.py
d.init(self)

import d
b.py
d.init(self)

import d
b.py
d.init(self)

如果没有给出与文件名相关的参数,如何在 d 中找出调用了哪个文件。只给了自己

例如,如果从 b.py 调用,在 d.py 中它应该返回带有完整路径的 b.py

4

2 回答 2

2

使用inspect.stack()功能

from inspect import stack

print stack()[1][1]

的返回值stack是具有(frame, filename, lineno, function, code_context, index)值的元组列表。

stack()[0]是您当前的函数,[1]是调用框架等。code_context字符串(默认情况下)是 1 行源代码,但如果您将更大的数字传递给stack()更多行上下文,则会提供:

# print 5 lines of context, 3rd line will be the 'current' line.
print stack(5)[1][-2]

请注意,为堆栈中的每个条目收集代码上下文有些昂贵;为每个条目读取源文件。0如果您不使用此功能,请将上下文设置为。

演示:

$ cat a.py 
import d
d.init()
$ cp a.py b.py; cp a.py c.py
$ cat d.py
import inspect

def init():
    print inspect.stack(0)[1][1]
$ python a.py
a.py
$ python b.py
b.py
于 2013-07-03T19:12:25.700 回答
0

您可以修改方法d.py以接受一个额外的参数,其中包含有关谁调用该函数的信息。

于 2013-07-03T19:09:07.170 回答