Python import 导入语法
Python import 导入语法详解(区分:相对导入 / 绝对导入 / 路径写法)
先明确核心前提:
Python 的 from ... import ... 语法 不是直接写操作系统文件路径(除特殊库如 importlib),而是基于 Python 包结构 + sys.path 模块搜索路径的模块导入语法
✅ 关键区别:
./..:属于 Python 包内相对导入语法(仅在作为包运行时生效,不能在顶层主脚本直接运行)//.//../:原生 Python import 语法不能直接写这种操作系统路径!不能写from ./config import xxx这种写法(会报错)
前置基础
✅ 什么是 Python 包(package)
文件夹里有 __init__.py 文件(Python3.3+ 支持隐式命名空间包),就是一个 Python 包,可以用 . 做模块层级引用
示例目录结构
my_project/
├── main.py # 顶层主脚本
├── config.py # 顶层配置模块
└── src/
├── __init__.py
├── app.py # 当前脚本
└── config.py # src 包内的 config.py
一、6种写法逐个拆解
1. from config import bootstrap_env
✅ 含义:绝对导入,从 Python 全局模块搜索路径里的 config 模块导入
- Python 会在
sys.path列表里依次查找config.py/config包- 运行
python main.py时:sys.path首项是my_project/,因此可直接导入顶层config.py - 可能匹配:顶层
config.py、第三方库、site-packages 里的模块,不一定是当前目录的 config
- 运行
- 适用:顶层脚本、全局模块
- 本质:按 Python 模块搜索路径的 绝对导入
# main.py
from config import bootstrap_env
- ❗注意:不是固定同级目录,受运行脚本位置和 sys.path 影响
2. from .config import bootstrap_env
✅ 含义:包内相对导入,当前包(同级目录)里的 config 模块
.= 当前所在包目录(和当前脚本同文件夹)- 在
src/app.py中写这句:导入src/config.py - 仅限 Python 包内部使用(文件夹必须被识别为包,存在
__init__.py) - ❌ 不能直接作为顶层脚本运行(不能直接 python src/app.py),会报错
ImportError: attempted relative import with no known parent package - ✅ 正确用法:从顶层运行(如
python -m src.app),以包模式运行
- 在
# src/app.py
from .config import bootstrap_env
- 和隐藏文件
.config完全无关! 这里.是语法前缀,不是文件名
3. from ..config import bootstrap_env
✅ 含义:包内相对导入,父目录(上一级包)里的 config 模块
..= 上一层父包目录- 在
src/app.py中写这句:导入my_project/config.py(src 的上一层目录) - 同样仅适用于包模式运行,不能直接单独运行脚本
- 在
# src/app.py
from ..config import bootstrap_env
...= 往上两层(极少数场景)
4. ❌ from .config import xxx ≠ from ./.config import xxx / from .config import xxx(隐藏文件 .config)
✅ .config(带点的文件名,隐藏文件)
如果真的存在一个叫 .config 的隐藏模块文件(.config.py)
- 原生 import 不推荐、也不能直接正常导入以
.开头命名的模块(不符合 Python 模块命名规范) - 不能直接写
from .config import xxx去匹配隐藏文件.config.py(会被识别为相对导入语法,不是隐藏文件名) - 如需读取隐藏配置文件(如
.env、.config):用文件读取(open / python-dotenv),不要用 import 语法
5. ❌ from /config import xxx、from ./config import xxx、from ../config import xxx
✅ 原生 Python import 不支持直接写 / ./ ../ 这种操作系统路径写法!直接写会语法报错
from /config import xxx→ 语法错误,不能直接用./config、../config是 Shell/操作系统路径写法,不属于原生 Python import 语法- 如果一定要通过文件路径导入模块(非标准用法):需要用
importlib库动态加载
# 示例:动态加载当前目录下的 config.py(非原生 import 写法) import importlib.util import sys spec = importlib.util.spec_from_file_location("config", "./config.py") config = importlib.util.module_from_spec(spec) spec.loader.exec_module(config) bootstrap_env = config.bootstrap_env/config:系统根目录下的文件,同样只能用 importlib 加载,不能写进原生 from ... import ...
- 如果一定要通过文件路径导入模块(非标准用法):需要用
6. 额外区分:..config(文件名)
- 文件名是
..config.py:属于非法模块命名,原生 import 无法正常引用,不推荐使用- 和
../config(上级目录)语法无关
- 和
总结对照表格
| 写法 | 类型 | 含义 | 能否直接原生import | 使用前提/坑点 |
|---|---|---|---|---|
from config import x |
绝对导入 | 按Python全局模块路径查找config模块 | ✅ | 受sys.path影响,取决于运行目录 |
from .config import x |
包相对导入 | 同级包目录下 config.py | ✅(包模式) | 不能直接单独运行脚本,必须作为包运行 |
from ..config import x |
包相对导入 | 上一级父包目录下 config.py | ✅(包模式) | 同上,仅包模式可用 |
.config.py(隐藏文件) |
隐藏配置文件 | Unix隐藏文件,不是标准Python模块 | ❌原生import不支持 | 用dotenv/open读取,不要import |
/config、./config、../config |
操作系统路径写法 | 根目录/当前目录/上级目录文件 | ❌原生语法不支持 | 只能用importlib动态加载 |
..config.py |
奇怪命名文件 | 自定义文件名模块 | ❌不符合Python规范 | 尽量不要这么命名模块 |
✅最佳实践
- 项目推荐:用 绝对导入(如
from src.config import bootstrap_env)或者规范的包相对导入 - 环境配置文件(
.env/.config):用python-dotenv加载,不要用 import - 运行脚本尽量用
python -m 包名.模块名模式,避免相对导入报错
要不要我给你写一份可直接运行的示例目录结构和导入代码?

浙公网安备 33010602011771号