【发布时间】:2022-01-05 21:17:49
【问题描述】:
如何使用路径从 Python 模块中仅导入特定类?
我需要使用文件路径从 Python 文件中导入特定类。我无法控制文件及其完全在我的包之外。
文件.py:
class Wanted(metaclass=MyMeta):
...
class Unwanted(metaclass=MyMeta):
...
元类实现在这里不相关。但是,我会指出它是我的软件包的一部分,我可以完全控制它。
导入示例:
spec = importlib.util.spec_from_file_location(name='Wanted', location="path_to_module/mudule.py")
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
这有效,Wanted 被导入。问题是Unwanted 也被导入了。实际上,只要为name(包括空字符串)提供any字符串值,Wanted 和Unwanted 都会从模块中导入。
这与之前的示例具有相同的效果,其中 Wanted 和 Unwanted 都被导入:
importlib.util.spec_from_file_location(name='random string', location="path_to_module/mudule.py")
我不是在寻找使用 importlib 的特定解决方案;任何合理的方式都可以。我会指出,我不需要在导入类时使用它,我只需要进行导入,然后我的元类会处理其余的事情。
【问题讨论】:
-
任何形式的导入都会执行整个文件。如果你不能忍受,那么这两个类不应该在同一个文件中。
-
@john-hen 有点断章取义,但是元类注册了它们,但是如果包含该组件的模块恰好有另一个配置指定只需要 1 个“组件”派生类这两个组件都会被执行,那是个问题。但我有我的答案,应该可以在元类中解决,我只是希望有一个更简单的解决方案。
标签: python python-import metaclass