python-3.x - 如何获取由 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
任何想法如何解决这一问题?
解决方案
的期望inspect.getfile
是class
对象(它有一个字符串__module__
属性,即模块名称)有它的模块sys.modules
(可以通过名称查找模块)
没有模块sys.modules
就无法使用该链来查找您的文件
把它放进sys.modules
你会做类似的事情:
sys.modules[M.__name__] = M
但是如果您可以在M
某处访问该对象,则可以.__file__
直接访问,或者如果您可以访问loader
或者,如果您知道该文件中的类上定义了某些方法,则可以询问该函数的代码对象:
>>> M.C.__init__.__code__.co_filename
t.py
推荐阅读
- python - 如何在用户函数中返回两个数据框
- ios - didSelectRowAt 将数据传递到新视图
- php - 无法将数据插入mysql数据库
- java - 显示在另一个类/文件中创建的菜单栏
- javascript - 自定义 Wordpress 插件:无法读取 null 的属性“parentElement”
- bash - awk 将三列中的数字相加,只返回一列
- opengl - 使用 GL_SHADER_STORAGE_BUFFER 将数组传递给片段着色器
- java - Velocity 1.7 - 有时 Directive.postRender 在 Velocity.evaluate 中抛出 NullPointerException
- angular - 如何获取在角度 7 中选中的多个复选框的计数
- javascript - 为getelementbyid动态生成的HTML获取null