使用 importlib 从 Python 模块仅导入特定的 class

Importing only a specific class from a Python module with `importlib`

如何使用其路径从 Python 模块导入 特定 class?

我需要使用文件路径从 Python 文件导入特定的 class。我无法控制该文件,它完全不在我的包内。

file.py:

class Wanted(metaclass=MyMeta):
    ...

class Unwanted(metaclass=MyMeta):
    ...

metaclass 实现与此处无关。但是,我会指出它是我包裹的一部分,我可以完全控制它。

导入示例:

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 也被导入了。事实上,只要 any 字符串值给 name(包括空字符串),WantedUnwanted 都是从导入的模块。

这与前面的示例具有相同的效果,其中 WantedUnwanted 都被导入:

importlib.util.spec_from_file_location(name='random string', location="path_to_module/mudule.py")

我不是在寻找使用 importlib 的特定解决方案;任何合理的方式都可以。我要指出的是,我不需要在导入时使用 class,我只需要导入发生,我的 metaclass 会处理其余的。

因为您将文件命名为“file.py”:

from file import Wanted

如果您的文件在文件夹中,您可以使用:

from folder.file import Wanted

如果我没记错的话,name参数只是用来命名你导入的模块。但是,更重要的是,当您导入任何模块时,您正在执行整个文件,这意味着在您的情况下这两个 类 都将被创建。无论您是写 from file import Wantedimport file 还是使用任何其他形式的导入语句都没有关系。

A Python program is constructed from code blocks. A block is a piece of Python program text that is executed as a unit. The following are blocks: a module, a function body, and a class definition.

来源:https://docs.python.org/3/reference/executionmodel.html#structure-of-a-program