【发布时间】:2009-09-21 22:56:31
【问题描述】:
如何在导入的文件中找到作为“导入器”的文件的名称?
如果a.py和b.py都导入c.py,那c.py到底能知道导入它的文件名吗?
【问题讨论】:
-
如果你想知道这两个名字,答案是否定的;第二个导入只会引入对现有模块的引用。这只不过是一项任务。
如何在导入的文件中找到作为“导入器”的文件的名称?
如果a.py和b.py都导入c.py,那c.py到底能知道导入它的文件名吗?
【问题讨论】:
使用
sys.path[0]
返回启动 python 解释器的脚本的路径。如果您可以直接使用此脚本,它将返回脚本的路径。但是,如果脚本是从另一个脚本导入的,它将返回该脚本的路径。
【讨论】:
在c.py的顶层(即任何函数或类之外),你应该可以通过运行得到你需要的信息
import traceback
然后检查 traceback.extract_stack() 的结果。在顶层代码运行时,模块的导入器(及其递归导入器等)都在调用堆栈上。
【讨论】:
这就是你有参数的原因。
c.py 的工作不是确定是谁导入的。
a.py 或 b.py 的工作是将变量 __name__ 传递给 c.py 中的函数或类。
【讨论】:
可以通过inspecting栈来完成:
#inside c.py:
import inspect
FRAME_FILENAME = 1
print "Imported from: ", inspect.getouterframes(inspect.currentframe())[-1][FRAME_FILENAME]
#or:
print "Imported from: ", inspect.stack()[-1][FRAME_FILENAME]
但是检查堆栈可能是错误的。为什么您需要知道从哪里导入文件?为什么不让导入的文件(a.py 和b.py)将名称传递给c.py? (假设您可以控制a.py 和b.py)
【讨论】: