第三十天打卡
项目根目录/
├── circle2.py          # 普通模块文件
└── utils/              # 工具包(Python包)├── __init__.py     # 包标识文件└── circle.py       # 工具模块
└── model/              # 主程序目录└── main.py         # 主程序入口 
关键问题:为什么直接运行 python model/main.py 会报错?
 
报错本质原因:Python的模块导入路径(sys.path)解析机制不同。
场景对比分析
| 运行方式 | sys.path 包含的路径 | 模块查找范围 | 能否找到 utils 包? | 
|---|---|---|---|
python model/main.py | 自动添加 model/ 目录的绝对路径 | 只在 model 目录及其子目录查找 | ❌ 找不到上级的 utils | 
python -m model.main | 自动添加 项目根目录 的绝对路径 | 在整个项目根目录下查找 | ✅ 可以正常找到 | 
具体原理拆解
1. 直接运行脚本时的路径问题
当使用 python model/main.py 时:
-  
Python会将
model/目录的绝对路径加入sys.path -  
此时所有导入语句都只能看到:
-  
model/目录下的文件 -  
系统标准库路径
 
 -  
 -  
因此当
main.py尝试导入utils包时:# 假设 main.py 中有如下导入 from utils import circle # 会报错 ModuleNotFoundErrorPython会在
model/目录下寻找utils包,但该包实际位于项目根目录,因此找不到。 
2. 使用模块运行模式 (-m) 的优势
 
当使用 python -m model.main 时:
-  
Python会将当前工作目录(即项目根目录)加入
sys.path -  
此时所有导入语句可以看到:
-  
项目根目录下的
utils包 -  
model/目录下的文件 
 -  
 -  
因此以下导入都能正常工作:
from utils import circle # 正确找到根目录下的 utils 包 import circle2 # 正确找到根目录下的 circle2.py
@浙大疏锦行 
