Python导入同级lib目录内模块触发ModuleNotFoundError如何解决
问题原因
你的推测完全正确:Python运行script.py时,会自动将script.py所在的根目录加入模块搜索路径sys.path,但不会自动加入lib子目录。当utils.py执行from lonlatboxes import lonlatboxes时,Python只会在sys.path包含的路径下搜索lonlatboxes.py,自然找不到存放在lib子目录下的这个文件。
你没有违背Python的导入规则,这只是Python默认模块搜索逻辑的正常表现。
符合需求的解决方案
方案1:修改utils.py的导入语句(最简便,无需新增文件)
直接在utils.py中写全模块的导入路径即可,因为根目录已经在搜索路径中,lib是根目录下的可识别路径:
from sqlalchemy import create_engine # python package from lib.lonlatboxes import lonlatboxes # 写全从根目录开始的路径
注意:该方案的前提是始终以script.py作为入口运行脚本,若需要单独直接运行utils.py,该方案会报错。
方案2:使用相对导入(推荐,目录结构变化时适配性更高)
在utils.py中使用相对导入,明确指定从当前同级目录导入lonlatboxes:
from sqlalchemy import create_engine # python package from .lonlatboxes import lonlatboxes # 点号代表当前文件所在的目录
该方案仅需要你在lib文件夹下新增一个空的__init__.py文件即可,新增的空文件没有任何业务逻辑,仅用来标识该文件夹是Python可识别的普通包,完全不属于你担心的“需要打包发布的正式包”范畴,不会增加额外的维护成本。
方案优势
两种方案都完全符合你的要求:
- 无需把所有文件放在同一文件夹,保持现有目录结构整洁
- 不需要手动修改
sys.path - 不需要做复杂的打包配置
内容的提问来源于stack exchange,提问作者Droid
相关产品推荐
相关产品推荐

