使用 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
(包括空字符串),Wanted
和 Unwanted
都是从导入的模块。
这与前面的示例具有相同的效果,其中 Wanted
和 Unwanted
都被导入:
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 Wanted
、import 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
如何使用其路径从 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
(包括空字符串),Wanted
和 Unwanted
都是从导入的模块。
这与前面的示例具有相同的效果,其中 Wanted
和 Unwanted
都被导入:
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 Wanted
、import 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