首页 > 解决方案 > 如何获取由 importlib 导入的模块的路径,其中定义了一个类

问题描述

有一种很好的方法可以获取定义类的模块的路径,只需执行

inspect.getfile(obj.__class__)

不幸的是,对于 importlib 加载的文件,它似乎崩溃了:

spec = importlib.util.spec_from_file_location('loaded_module', module_path)
M = importlib.util.module_from_spec(spec)
spec.loader.exec_module(M)

obj = M.MyClass()
inspect.getfile(obj.__class__)

结果是

  File "/nix/store/z65l1jqvxa58zzwwa3bvglb6asj4y8cv-python3-3.8.5/lib/python3.8/inspect.py", line 665, in getfile
    raise TypeError('{!r} is a built-in class'.format(object))
TypeError: <class 'loaded_module.MyClass'> is a built-in class

任何想法如何解决这一问题?

标签: python-3.xpython-importlib

解决方案


的期望inspect.getfileclass对象(它有一个字符串__module__属性,即模块名称)有它的模块sys.modules(可以通过名称查找模块)

没有模块sys.modules就无法使用该链来查找您的文件

把它放进sys.modules你会做类似的事情:

sys.modules[M.__name__] = M

但是如果您可以在M某处访问该对象,则可以.__file__直接访问,或者如果您可以访问loader

或者,如果您知道该文件中的类上定义了某些方法,则可以询问该函数的代码对象:

>>> M.C.__init__.__code__.co_filename
t.py

推荐阅读