importlib.import_module仅支持绝对模块名导入,需确保模块在sys.path中可见或使用完整包路径;若只有文件路径,则应改用importlib.util.spec_from_file_location配合module_from_spec动态加载。

直接用 importlib.import_module 就行,但模块名必须是完整路径(含包层级),不能只传文件名或相对路径。
为什么 importlib.import_module("mymodule") 常报 ModuleNotFoundError
因为 importlib.import_module 不搜索当前目录,它按 Python 的标准导入规则解析:模块名必须可被 sys.path 中的路径定位到,且若为子模块,需写全名(如 "package.submodule"),不能省略包前缀。
- 错误示例:
importlib.import_module("utils")—— 若utils.py在当前目录但未在包内、也未把当前目录加进sys.path,就会失败 - 正确做法:确保目标模块在
sys.path中可见,或先用sys.path.insert(0, "/path/to/dir")注入路径 - 若模块在包中(如
myproject/lib/helpers.py),且myproject是顶层包,则应传"myproject.lib.helpers",而非"lib.helpers"或"helpers"
如何从文件路径动态导入(绕过包结构限制)
当只有 .py 文件路径(如 /tmp/dynamic_script.py),又不想改 sys.path 或建包时,importlib.import_module 不适用——得换方式:
- 用
importlib.util.spec_from_file_location+importlib.util.module_from_spec组合 - 示例:
import importlib.util<br>spec = importlib.util.spec_from_file_location("temp_mod", "/tmp/dynamic_script.py")<br>mod = importlib.util.module_from_spec(spec)<br>spec.loader.exec_module(mod) - 注意:
spec_from_file_location第二个参数必须是绝对路径;若传相对路径,可能因工作目录变化导致加载失败
importlib.import_module 的常见误用场景
容易混淆的是它和 __import__ 的行为差异,以及对“相对导入”的处理:
立即学习“Python免费学习笔记(深入)”;
- 它不支持类似
from . import xxx的隐式相对导入;传入的字符串必须是绝对模块名 - 传入
"os.path"可以,但传入".path"会报ValueError: attempted relative import - 如果模块已导入过,
importlib.import_module返回缓存中的模块对象,不会重新执行模块代码——这点和直接import一致 - 别用它反复导入同一模块做“热重载”:Python 不自动清理旧模块引用,也不会卸载已加载模块
真正要注意的是模块定位逻辑和路径管理,不是函数调用本身。多数失败都源于没搞清“模块名”在 Python 导入系统里到底指什么——它不是文件名,而是由 sys.path 和点分命名空间共同定义的地址。


















