Python报ModuleNotFoundError: No module named 'functions'错误咨询
错误原因
Python导入模块时,会按照sys.path列表中的路径顺序搜索目标模块。当你在项目根目录执行./manifold.py时,Python会自动将manifold.py所在的项目根目录加入sys.path作为顶层模块搜索路径。
你在lyrics/__init__.py中写的import functions属于顶层导入语句,Python会直接在顶层搜索路径(也就是项目根目录)下查找functions.py文件,但实际functions.py存放在lyrics子目录下,根目录不存在对应文件,因此抛出ModuleNotFoundError。
另外你在lyrics/__init__.py中写的from lyrics import *存在逻辑问题:__init__.py本身就是lyrics包的初始化文件,在包初始化阶段反向导入自身,非常容易触发循环导入异常,属于冗余的错误写法。
修复方法
按以下两步调整即可解决问题:
- 修正包内模块的导入语句
包内模块互相导入时使用标准相对导入(推荐)或者正确的绝对路径导入,不要写跨层级的顶层导入:- 相对导入写法(包内导入首选):将
import functions改为from . import functions,其中.代表当前包(即lyrics目录)的路径,Python会直接在lyrics目录下查找functions模块,不会遍历顶层搜索路径。 - 绝对导入写法:也可以写全顶层包路径,改为
from lyrics import functions,只要lyrics包在Python的模块搜索路径中即可正常加载。
- 相对导入写法(包内导入首选):将
- 删除冗余的循环导入代码
直接删掉lyrics/__init__.py中的from lyrics import *语句,该语句没有实际作用,只会提升循环导入报错的概率。
修复完成后,lyrics/__init__.py的参考内容如下:
from . import functions # 如果需要把functions内的接口直接暴露为lyrics包的对外接口,可以按需添加 # from .functions import *
调整完成后再在项目根目录执行./manifold.py即可正常运行,不需要额外修改目录结构或者追加搜索路径配置。
内容的提问来源于stack exchange,提问作者RandomFellow
相关产品推荐
相关产品推荐

