如何获取从哪个python类/函数/变量导入的源文件?

2024-09-29 19:33:39 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我已经导入了两个这样的模块:

from module0 import hello_func
from directory.module1 import hello_var

其中模块0:

def hello_func(): return "hello from module0"

和模块1:

hello_var = "hello from module1"

如何知道每个对象是从哪个文件导入的?你知道吗

我试着检查locals()函数,但是没有任何东西提供对文件的引用。。。你知道吗


Tags: 模块文件对象函数fromimporthelloreturn
3条回答

您可以在每个模块中定义一个常量及其路径,类似的操作应该可以:

import os

FILE_PATH = os.path.abspath(__file__)

导入该模块时,可以访问其位置,如下所示:

import module

print(module.FILE_PATH)

实际上,你自己也回答了你的问题:

Let's say I have imported two modules
(insert "from xxx import *" here)
How can I know from which file is each object being imported?

不使用通配符导入的原因之一正是为了明确名称从何处导入(另一个原因是避免使用一个导入的名称来隐藏以前导入的名称-这往往会以最意想不到的方式破坏代码,有时甚至很难发现)。你知道吗

请注意,在您编辑的问题中:

from module0 import hello_func
from directory.module1 import hello_var

你已经对名字的来源有了更好的认识。不是确切的文件路径,但至少是包/模块的名称。你知道吗

这也是不应该使用通配符导入的主要原因之一。你知道吗

现在如果你想知道确切的文件路径,你有两种不同的情况。你知道吗

有些对象跟踪它们是在哪里创建的(主要是模块、类、函数等-参见inspect.getfile()支持的类型列表),然后,您已经知道答案了(使用inspect.getfile()xD)。你知道吗

但大多数类型不会(因为没有理由)。在这种情况下,您必须知道它们是从哪个模块导入的,并对模块本身调用inspect.getfile()。在这种情况下,如果使用通配符导入,则必须手动检查从中导入的所有模块,以找出哪个模块定义了此名称。好好享受。特别是如果其中一个模块也使用了通配符导入。。。你知道吗

one question please: where they does keep traces? and how these traces look like?

模块将其保存在__file__属性中。函数和类在其__module__属性中保留对其模块名称的引用,从中可以使用它从sys.modulesdict(当前进程中已导入的所有模块的缓存)检索模块,dict将为您提供文件。你知道吗

我从来没有必要在这些信息中搜索回溯、帧、代码对象等,所以恐怕你得自己检查;-)

使用inspect和os模块的另一个解决方案。你知道吗

import module0
import os
import inspect

print(os.path.abspath(inspect.getfile(module0.hello_func)))

相关问题 更多 >

    热门问题