Python嵌套文件夹导入模块遇ModuleNotFoundError问题求助
解决Python多层子包导入的ModuleNotFoundError问题
问题原因
运行main.py时,Python的sys.path默认包含main.py所在的根目录,而subsubpackage属于subpackage的子目录,不在根目录的直接子层级中,因此submod.py里的from subsubpackage import subsubmod无法找到目标模块。而单独运行submod.py时,Python会自动把submod.py所在的subpackage目录加入sys.path,所以能正常导入subsubpackage。
另外注意:你的main.py里的入口判断存在语法错误,正确写法应为if __name__ == '__main__':(前后是双下划线),否则main()函数不会被执行。
解决方案
方案1:使用相对导入(推荐)
修改submod.py中的导入语句为相对路径,用.表示当前包目录:
from .subsubpackage import subsubmod
这种方式符合Python包的导入规范,能明确表示导入当前包下的子包,结构清晰且可移植性强。
方案2:使用绝对导入
修改submod.py中的导入语句为基于项目根目录的绝对路径:
from subpackage.subsubpackage import subsubmod
运行main.py时,项目根目录已在sys.path中,这种绝对路径能被Python正确解析。
方案3:临时修改sys.path(不推荐)
如果不想调整导入逻辑,可以在submod.py开头添加代码,将当前脚本所在目录加入sys.path:
import sys from pathlib import Path # 将submod.py所在目录添加到sys.path sys.path.append(str(Path(__file__).parent)) from subsubpackage import subsubmod
这种方法虽能临时解决问题,但会破坏包结构的可移植性,当项目目录结构变动时容易出错,不建议在正式项目中使用。
内容的提问来源于stack exchange,提问作者Cory
相关产品推荐
相关产品推荐

