Python找不到同级目录包的根本原因是其模块搜索路径(sys.path)默认仅包含脚本所在目录和当前工作目录,不自动包含同级子目录;即使存在__init__.py,若未以包方式运行(如用python -m)或未手动添加路径,import仍会失败。

为什么 Python 找不到同级目录里的包
Python 默认只把脚本所在目录(sys.path[0])和当前工作目录加入模块搜索路径,不会自动递归扫描同级子目录。即使你加了 __init__.py,如果该目录没被 Python 视为“包上下文”,import mypackage 依然会报 ModuleNotFoundError: No module named 'mypackage'。
确保 __init__.py 存在且位置正确
__init__.py 必须是空文件或含合法 Python 代码,且必须放在你想作为包的**目录根下**——不是父目录,也不是子目录里。
- 结构正确示例:
project/ ├── main.py ├── utils/ │ └── __init__.py ← 这里需要 │ └── helpers.py
- 错误做法:在
project/根目录放__init__.py(这会让整个 project 变成包,但main.py不在包内,反而更难导入) - 空文件即可,不需要写内容;但若写了语法错误,导入时会直接抛
SyntaxError
运行方式决定能否成功导入
用错命令是导致“明明有 __init__.py 却导不进”的最常见原因。关键不是文件是否存在,而是 Python 启动时怎么解析路径。
安全 Python 代码沙箱:在隔离的沙箱中执行任意 Python 代码,预装 requests、NumPy、pandas 库。返回 stdout、stderr。
- ❌ 错误:在
project/目录下执行python main.py→main.py被当脚本,其所在目录(project/)成为sys.path[0],但utils/是子目录,不是包路径 - ✅ 正确:在
project/的**父目录**执行python -m project.main→ 前提是project/下有__init__.py,且main.py改为main.py不再是顶层脚本,而是模块 - ✅ 更常用:保持
main.py为入口,但在开头手动加路径:import sys<br>from pathlib import Path<br>sys.path.insert(0, str(Path(__file__).parent))
这样import utils就能命中project/utils/
PyCharm 或 VS Code 中的隐藏陷阱
IDE 通常会自动把项目根加进 PYTHONPATH,看起来能导入,但终端里跑就失败——这不是代码问题,是环境不一致。
立即学习“Python免费学习笔记(深入)”;
- PyCharm:检查
Run → Edit Configurations → Add content roots to PYTHONPATH是否勾选(建议关掉,逼自己写可移植代码) - VS Code:确认
python.defaultInterpreterPath指向的环境没被 IDE 注入额外路径 - 验证方法:在终端中运行
python -c "import sys; print(sys.path)",对比 IDE 内输出,差异项就是隐患点
__init__.py 缺不缺,而是没意识到 Python 的模块加载机制绑定的是“运行时路径上下文”,而不是“文件系统相对位置”。哪怕所有 __init__.py 都到位,换一个启动方式,import 就可能突然失效。

















