Python3.6升级3.7+后根目录导入报错ModuleNotFoundError解决方案问询
问题根因
- 直接运行
python3.x mymain.py时,Python默认只会将mymain.py所在的this_dir目录加入模块搜索路径sys.path,不会自动把this_dir的父目录加入搜索路径,因此无法找到this_dir包本身,from this_dir import xxx类的导入就会失败。 - Python 3.7修正了3.6及更早版本中存在的隐式相对导入 fallback 逻辑,之前版本错误兼容了子包内直接运行文件时的跨包导入写法,3.7之后就会触发明确的模块未找到报错。
修复方案
仅修改this_dir/__init__.py无法独立解决该问题:__init__.py的执行时机是Python已经成功找到this_dir包之后,报错发生时根本不会运行到__init__.py中的代码,因此单独调整该文件没有效果。
可以选择以下任意一种方案修复:
- 方案1:调整运行命令,无需修改任何代码
在this_dir的父目录下执行模块运行命令即可:
该方案同时兼容和python3.x -m this_dir.mymain -p1 -p2 ...this_dir平级的其他模块的from this_dir import far导入逻辑。 - 方案2:在mymain.py开头新增路径配置
在所有from this_dir import xxx语句之前加入以下代码,手动将父目录加入搜索路径:
修改后可直接使用原有命令运行,也兼容平级模块的导入逻辑。import sys from pathlib import Path # 将this_dir的父目录加入模块搜索路径 sys.path.insert(0, str(Path(__file__).parent.parent.resolve())) - 方案3:修改mymain.py内的导入写法
将from this_dir import foo类的绝对导入改成包内相对导入:
该方案仅需修改mymain.py内的导入语句,不会影响平级模块对from . import foothis_dir的导入。
内容的提问来源于stack exchange,提问作者eorojas
相关产品推荐
相关产品推荐

