Python跨目录导入模块触发ModuleNotFoundError的原因及解决方法咨询
报错原因
你在dir_b目录下执行run.py时,Python的当前工作目录为dir_b,你将父目录../添加到sys.path仅能保证解释器可以找到dir_a这个顶层包,无法解决func_g.py内部的导包问题:func_g.py中写的from func_f import f属于顶层模块导入逻辑,解释器会在sys.path包含的所有路径下搜索名为func_f的模块,但父目录下只有dir_a、dir_b两个文件夹,func_f.py存放在dir_a内部,不属于顶层可直接搜索到的模块,因此触发报错。
解决方案
推荐以下两种规范方案二选一即可:
- 方案1:修改
func_g.py的导包语句为包内相对导入
把func_g.py第一行改为:
from .func_f import f
当func_g作为dir_a包的子模块被导入时,相对导入语法.会直接锁定同目录下的func_f模块,不受执行目录影响。
- 方案2:修改
func_g.py的导包语句为带包名的绝对导入
把func_g.py第一行改为:
from dir_a.func_f import f
因为你已经把dir_a所在的父目录加入了sys.path,解释器可以定位到dir_a包下的func_f模块。
不推荐的临时方案:你也可以在
run.py的sys.path.append('../')后额外加一行sys.path.append('../dir_a'),这种方式会污染全局模块搜索路径,后续项目复杂度提升后容易出现模块冲突问题。
内容的提问来源于stack exchange,提问作者neco
相关产品推荐
相关产品推荐

