Python项目存在__init__.py仍报ModuleNotFoundError问题求助
跨包导入ModuleNotFoundError问题解决方案
出现该错误的核心原因是Python运行时的模块搜索路径sys.path默认没有包含你的项目根目录:你直接进入assignment02目录运行new_file.py时,Python只会把当前assignment02目录加入搜索路径,自然找不到同属于project目录下的assignment01包。
下面是三种可落地的解决方案,可根据自己的使用场景选择:
- 方法1:调整运行方式(无侵入式,最推荐)
不要进入assignment02目录运行脚本,切换到project目录下,以模块方式运行脚本:
该方式不需要修改任何代码,Python会自动将当前工作目录(也就是python -m assignment02.new_fileproject目录)加入搜索路径,你原本写的导入语句可以直接正常生效。 - 方法2:临时添加搜索路径(适合调试场景)
在new_file.py的最开头,所有导入语句之前添加如下代码:
添加完成后不管你在哪个目录运行import sys import os # 自动获取project目录的绝对路径,加入模块搜索路径 sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))new_file.py,都能正常找到assignment01包。 - 方法3:配置PYTHONPATH环境变量(本地开发长期使用)
把你的project目录的绝对路径添加到系统的PYTHONPATH环境变量中:- Windows cmd 执行:
set PYTHONPATH=C:\xxx\your_project_path\project;%PYTHONPATH% - Mac/Linux 终端执行:
export PYTHONPATH=/xxx/your_project_path/project:$PYTHONPATH
配置完成后,该环境下所有Python项目都能识别project下的所有子包。
- Windows cmd 执行:
注意:不要尝试用相对导入语法(比如
from ..assignment01 import old_file)解决该问题,相对导入仅支持包内部模块调用,直接运行脚本时会触发相对导入错误。
内容的提问来源于stack exchange,提问作者Marcello Zago
相关产品推荐
相关产品推荐

