You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python模块导入顺序解析:绝对导入的模块优先级判定机制

Python绝对导入的模块解析顺序

嘿,这个问题问到点子上了——哪怕你说的代码是“非最佳实践”,搞懂Python的绝对导入查找逻辑,能帮你看透很多导入bug的根源!

当你在代码里写import some_module或者from some_package import some_module这种绝对导入时,Python会按照下面的顺序一步步找要导入的模块/包:

  • 第一步:检查内置模块
    Python会先优先查找自己的内置模块(比如os、sys、math这些),只要名字匹配,直接导入,不会去其他路径找。这也是为什么你自己写个math.py放在脚本同目录,运行时不会导入你写的那个——内置模块优先级最高。

  • 第二步:遍历sys.path中的路径
    如果第一步没找到,Python就会去sys.path列表里的路径逐个查找,顺序是列表里的先后顺序,找到第一个匹配的就停止。
    这里得说清楚sys.path默认包含哪些路径:

    • 运行脚本时的当前工作目录(注意不是脚本所在目录,除非你是在脚本目录下运行它;如果用绝对路径运行脚本,当前工作目录会是你执行命令的目录)
    • 脚本所在的目录(当你直接运行.py文件时,这个目录会自动被加入sys.path的开头)
    • 环境变量PYTHONPATH里配置的路径
    • Python标准库的安装路径
    • site-packages目录(第三方包安装的地方)
  • 第三步:处理命名空间包(Python 3.3+)
    如果前面两步都没找到,但在sys.path的某些路径下有同名的目录(没有__init__.py的那种),Python会把这些目录当作命名空间包合并起来,不过这属于比较特殊的情况了。

举个你提到的file_a.py的场景例子:假设你的文件夹结构是这样的:

my_project/
├── utils/
│   ├── __init__.py
│   └── helper.py
└── file_a.py

当你在file_a.py里写from utils import helper时:

  1. 先检查有没有内置的utils模块?没有。
  2. 看sys.path——因为你运行file_a.py时,my_project目录会被加入sys.path,所以Python会在my_project下找到utils包,然后导入helper.py。

但如果你的sys.path里有另一个地方也有个utils包,而且那个路径在my_project前面,那Python就会导入那个utils,而不是你项目里的,这就是很多导入冲突的根源!

另外要提一句:Python 3里绝对导入是默认行为,而Python 2里需要加from __future__ import absolute_import才能启用这个逻辑,不过现在Python 2已经没人用了,不用太纠结。

内容的提问来源于stack exchange,提问作者Nakamura

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 09:10:03