Python子目录含__init__.py仍出现ModuleNotFoundError问题排查
问题原因
当你在ats_program目录下执行python lha/build_annoy_index.py时,Python会将build_annoy_index.py所在的lha目录添加到sys.path的最优先位置,而非上层的ats_program目录。此时代码里的from lha.preprocessing.clean_text import clean_text会让Python在sys.path中查找名为lha的包,但lha目录本身并没有子包lha,因此触发ModuleNotFoundError。
解决方法(不使用
import sys,仅依赖__init__.py) 你的项目里已经存在所有需要的空__init__.py(只要文件存在就能标记目录为Python包,内容为空不影响),只需调整运行方式即可:
- 不要直接运行脚本文件,而是将其作为模块执行。在
ats_program目录下执行以下命令:
这种方式会让Python自动将python -m lha.build_annoy_indexats_program目录加入sys.path,此时lha会被识别为顶层包,from lha.preprocessing.clean_text import clean_text就能正常找到对应的模块。
如果坚持要使用相对导入(比如把导入语句改成from .preprocessing.clean_text import clean_text),同样需要用python -m的方式运行脚本,否则直接执行脚本会触发“attempted relative import in non-package”的错误,因为独立运行的脚本不被视为包的一部分。
内容的提问来源于stack exchange,提问作者dmbfck
相关产品推荐
相关产品推荐

