Skip to content

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 的行为:

  1. 找到 src/run_capture.py 文件
  2. src/ 目录添加到 sys.path(即 run_capture.py 所在的目录)
  3. 执行 from tools.bootstrap import main 时:
  4. sys.path 中查找 tools
  5. 首先在 src/ 目录下查找
  6. 找到 src/tools/bootstrap.py

场景 2:作为模块运行

# 在项目根目录执行
python -m src.run_capture

Python 的行为:

  1. 当前工作目录(项目根目录)添加到 sys.path
  2. 执行 from tools.bootstrap 时:
  3. 在项目根目录下查找 tools/
  4. 找不到 Projects/tools/bootstrap.py
  5. 需要改为 from src.tools.bootstrap import main

场景 3:在 src/ 目录下执行

cd src/
python run_capture.py

Python 的行为:

  1. src/ 目录添加到 sys.path(因为 run_capture.pysrc/ 下)
  2. from tools.bootstrap 能找到 src/tools/bootstrap.py

总结

回答您的问题:

难道 python 中的 from xx import xx 是根据当前文件来找的吗?

是的! Python 的模块搜索是基于当前执行文件所在的目录

  1. 执行 python src/run_capture.py
  2. Python 将 src/ 目录添加到 sys.path
  3. from tools.bootstrapsrc/ 下查找
  4. 找到 src/tools/bootstrap.py

这就是为什么能找到 src/tools/bootstrap.py 而不是 Projects/tools/bootstrap.py 的原因!

Comments