Python 模块搜索机制详解
复制本地路径 | 在线编辑
问题
主目录 Projects 中,我执行了 python src/run_capture.py,这个文件有语句 from tools.bootstrap ,它能够能找到 src/tools/bootstrap.py。
我的理解是 from tools.bootstrap 应该是在当前执行目录(即 Projects)中进行寻找的,所以应该找 tools/bootstrap.py,应该找不到才对。
关键概念:Python 的模块搜索路径
当 Python 执行一个文件时,会将该文件所在的目录添加到 sys.path 中。
场景分析
场景 1:直接执行脚本文件
# 在项目根目录执行
python src/run_capture.py
Python 的行为:
- 找到
src/run_capture.py文件 - 将
src/目录添加到sys.path(即run_capture.py所在的目录) - 执行
from tools.bootstrap import main时: - 在
sys.path中查找tools包 - 首先在
src/目录下查找 - 找到
src/tools/bootstrap.py✅
场景 2:作为模块运行
# 在项目根目录执行
python -m src.run_capture
Python 的行为:
- 将当前工作目录(项目根目录)添加到
sys.path - 执行
from tools.bootstrap时: - 在项目根目录下查找
tools/ - 找不到
Projects/tools/bootstrap.py❌ - 需要改为
from src.tools.bootstrap import main✅
场景 3:在 src/ 目录下执行
cd src/
python run_capture.py
Python 的行为:
- 将
src/目录添加到sys.path(因为run_capture.py在src/下) from tools.bootstrap能找到src/tools/bootstrap.py✅
总结
回答您的问题:
难道 python 中的 from xx import xx 是根据当前文件来找的吗?
是的! Python 的模块搜索是基于当前执行文件所在的目录:
- 执行
python src/run_capture.py时 - Python 将
src/目录添加到sys.path from tools.bootstrap在src/下查找- 找到
src/tools/bootstrap.py✅
这就是为什么能找到 src/tools/bootstrap.py 而不是 Projects/tools/bootstrap.py 的原因!