Python动态导入模块时出现Class not found错误求助
问题原因
__import__函数默认只会返回顶层模块,当你传入plugins.core.plugin时,它返回的是plugins模块,而不是你需要的plugins.core.plugin模块。你直接从plugins里找Plugin类,自然会报错,因为Plugin实际在plugins.core.plugin这个子模块里。
解决方案
有两种靠谱的解决方式:
方式一:修复__import__的用法
给__import__加上fromlist参数,让它返回最内层的目标模块:
def import_plugin(plugin_name): src = f'plugins.{plugin_name}.plugin' # fromlist传非空列表,强制__import__返回最内层的plugin模块 module = __import__(src, fromlist=['']) return getattr(module, 'Plugin')
方式二:用importlib.import_module(推荐)
这是Python3.1+官方推荐的动态导入方法,语法更直观,可读性更强:
import importlib def import_plugin(plugin_name): module_path = f'plugins.{plugin_name}.plugin' # 直接导入目标模块 module = importlib.import_module(module_path) return module.Plugin
额外注意事项
确保你的plugins目录和plugins/core目录下都有__init__.py文件(可以是空文件),虽然Python3.3+支持无__init__.py的命名空间包,但显式添加能避免不少潜在问题。
内容的提问来源于stack exchange,提问作者chrispytoes
相关产品推荐
相关产品推荐

