Python最小示例项目模块导入报ModuleNotFoundError该如何解决?
问题原因
这是Python模块搜索路径的逻辑导致的:
- 直接运行
python utils/foo.py时,Python会自动将foo.py所在的utils/目录加入sys.path(模块搜索路径列表),因此from bar import Bar可以找到同目录下的bar.py,运行正常。 - 运行
python main.py时,Python会将main.py所在的项目根目录加入sys.path,此时sys.path中不存在utils/目录,foo.py中的from bar import Bar属于绝对导入,只会在sys.path登记的路径下搜索bar模块,因此抛出找不到模块的错误。
解决方案
推荐两种符合规范的修复方式:
方案1:使用同包相对导入
修改foo.py中的导入语句为:
from .bar import Bar
这是Python官方推荐的同包内模块导入写法,.代表当前包目录,无论包被外部导入还是作为模块运行,都可以正常定位到同包下的其他模块。
注意:如果需要单独运行
foo.py,不要直接用python utils/foo.py执行,改用python -m utils.foo命令,将其作为包模块运行即可正常支持相对导入。
方案2:使用完整路径的绝对导入
修改foo.py中的导入语句为:
from utils.bar import Bar
从顶层包开始写完整导入路径,运行main.py时项目根目录在sys.path中,可以正常定位到utils.bar模块。
规范说明
你原来的写法确实不符合Python包的导入规范:
当你把utils作为一个包对外提供时,包内的模块互相导入不应该直接依赖运行时的sys.path临时配置,要么使用相对导入,要么使用从顶层包开始的完整绝对导入,才能保证包在任意环境下被导入时都能正常工作。
内容的提问来源于stack exchange,提问作者Nevermore
相关产品推荐
相关产品推荐

