Python找不到同级目录py文件的根本原因是sys.path未包含该目录,而非路径错误;运行方式(python main.py或python -m package.main)决定sys.path初始化,__init__.py仅标识包但不解决路径可见性,手动修改sys.path仅为临时调试方案。

Python找不到同级目录py文件,根本不是路径写错了
Python解释器报ModuleNotFoundError或ImportError,说找不到同级目录里的utils.py或models/包,大概率不是你路径拼错了,而是Python压根没把那个目录当成“可导入的位置”。它只看sys.path里有哪些路径,然后挨个找。你的utils/如果不在sys.path[0](通常是当前脚本所在目录)或后续路径中,就等于不存在。
运行方式决定sys.path,python main.py和python -m package.main完全不同
你在终端里执行命令的方式,直接决定了Python怎么初始化sys.path:
-
python main.py:把main.py所在目录加到sys.path[0],但它的同级目录(比如utils/)不会自动加入 -
python -m project.main:要求project/是包(含__init__.py),此时project/父目录被加入sys.path[0],于是project/utils/才能被识别为子包 - PyCharm默认用第一种方式运行,所以即使目录结构看着合理,也会“看不见”同级模块
__init__.py不是万能的,空文件也得放对位置
__init__.py只是告诉Python“这个目录可以当包”,但它不解决路径可见性问题:
- 放在
utils/里:让utils变成包,但前提是utils本身已在sys.path中 - 放在项目根目录:
project/__init__.py会让整个project/成为包,但如果你用python main.py启动,main.py就不在包内,反而更难导入 - 内容为空即可;如果写了语法错误,导入时会直接抛
SyntaxError,比ModuleNotFoundError还难排查
最稳的临时解法:手动把父目录加进sys.path
不想改运行方式、又急着调试?在main.py开头加这几行:
立即学习“Python免费学习笔记(深入)”;
import sys import os sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
这行的作用是:找到main.py的绝对路径 → 上溯两级 → 把那个父目录塞进sys.path最前面。之后import utils或from models import Net就能通了。注意这只是开发期快速验证手段,打包或部署时得换正式方案。
import,而是没意识到Python导入系统根本不“看目录结构”,它只机械地查sys.path列表——而这个列表由你敲下的那条命令决定。


















