
本文详解如何在 Python 中从多层嵌套目录(如 a_a/b/c/print.py)中导入函数,涵盖包命名规范、__init__.py 必要性、模块路径配置及标准导入语法。
本文详解如何在 python 中从多层嵌套目录(如 `a_a/b/c/print.py`)中导入函数,涵盖包命名规范、`__init__.py` 必要性、模块路径配置及标准导入语法。
在 Python 中,从深层嵌套目录导入模块并非简单的路径拼接,而需同时满足语法合法性、包结构完整性和运行时可发现性三大前提。下面将分步说明完整实践方案。
✅ 第一步:修正模块名——禁止使用连字符(-)
Python 标识符(包括模块名、包名)不允许包含连字符 -,否则会触发 SyntaxError: invalid syntax。因此,必须将 a-a 重命名为合法名称,例如 a_a(推荐)、aa 或 a_a_project:
mv a-a a_a
✅ 第二步:补全包结构——每个目录下添加 __init__.py
Python 3.3+ 虽支持隐式命名空间包,但为确保兼容性与明确性,每个子目录都应包含 __init__.py 文件(可为空)。最终目录结构应如下:
a_a/ ├── __init__.py # 标记 a_a 为顶层包 ├── b/ │ ├── __init__.py # 标记 b 为子包 │ └── c/ │ ├── __init__.py # 标记 c 为子包 │ └── print.py # 定义 print_5() 和 print_10() └── test.py # 当前执行脚本
? 提示:
__init__.py可为空文件(touch a_a/__init__.py),也可用于控制包的公共接口(如from .c.print import *)。立即学习“Python免费学习笔记(深入)”;
✅ 第三步:确保模块可被发现——正确设置 Python 模块搜索路径
Python 只会在 sys.path 列表中的目录里查找模块。若 test.py 位于 a_a/ 内部,则需保证其父目录(即 a_a 的上一级)在 sys.path 中。有两种主流做法:
快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。
方法一:从 a_a 的父目录运行(推荐)
假设当前工作目录是 a_a 的上级(即 ls 显示 a_a/ test.py 的位置),请进入该父目录并运行:
# 正确:在 a_a 的同级目录下执行 python -m a_a.test
此时 Python 自动将当前目录加入 sys.path,a_a 可被识别为顶层包。
方法二:在 test.py 中动态追加路径(适用于调试)
若必须直接运行 python a_a/test.py,可在 test.py 开头手动注入路径:
import sys from pathlib import Path # 将 a_a 的父目录加入 Python 路径 sys.path.insert(0, str(Path(__file__).parent.parent)) # 现在可以正常导入 from a_a.b.c.print import print_5, print_10 print_5() # 输出: 5 print_10() # 输出: 10
⚠️ 注意:此方式不推荐用于生产环境,因路径硬编码易出错;应优先采用
-m方式运行。
✅ 第四步:使用绝对导入语法
在 test.py 中,使用清晰、可读的绝对导入语句:
# ✅ 推荐:显式导入所需函数 from a_a.b.c.print import print_5, print_10 # ✅ 或导入整个模块后调用 from a_a.b.c import print print.print_5() # ❌ 避免:相对导入(如 from ...c.print import *)在顶层脚本中无效 # ❌ 错误:from a-a.b.c.print import ...(含 `-` 语法错误)
? 总结与最佳实践
- 命名规范:所有包/模块名仅使用字母、数字、下划线,且不能以数字开头;
-
结构强制:每级目录均需
__init__.py(即使为空); -
运行方式:优先使用
python -m package.module启动,避免路径问题; -
导入原则:用
from ... import ...显式声明依赖,提升可读性与可维护性; -
调试技巧:运行
python -c "import sys; print('\n'.join(sys.path))"查看当前模块搜索路径。
遵循以上步骤,即可稳健、可复现地导入任意深度嵌套的 Python 函数。

















