Python多层级项目无法通过sys.path实现跨目录导入问题求解
可行的Python项目导入方案
第一步:规范包结构
先在所有层级的目录下新增空的__init__.py文件,需要添加的目录包括:
- 顶层App目录
- Core目录
- Core/Controllers目录
- Core/Controllers/Components目录
- Core/Controllers/Components/Elements目录
- Core/DTO目录
- Config目录
- DB目录
- Util目录
添加完成后Python会将整个项目识别为可导入的标准包结构,不需要额外的sys.path路径添加操作,你之前在Components的__init__.py中加的__import__批量导入、sys.path.append逻辑都可以直接删除。
分场景导入写法(全部使用相对导入,完全符合需求)
场景1:Elements目录下同文件互导
比如AB.py导入同目录AA.py的aa类:
from .AA import aa
场景2:Elements目录导入Core/DTO下的类
比如导入H.py的h类:
Elements目录到Core目录需要向上跳3级,写法为:
from ...DTO.H import h
注:每一个.代表向上跳转一级目录,...等价于向上跳转3级到Core目录,再指向同级的DTO目录
场景3:Elements目录导入Config、DB、Util下的文件
这三个目录和Core同级,都在App根目录下,Elements目录到App根目录需要向上跳4级:
- 导入Config/E.py的对应类:
from ....Config.E import 你的类名 - 导入DB/db.py的db实例:
from ....DB.db import db - 导入Util/utils.py的工具方法:
from ....Util.utils import 你需要的函数/类
其他层级的文件导入utils.py只需要调整相对路径的点数量即可,比如Core/DTO下的文件导入utils:from ...Util.utils import xxx
注意事项
- 导入语句的目录名必须和实际目录大小写完全一致,Python导入大小写敏感,你之前写的
from app.DB.db import db大小写和实际的App目录不符,必然报错。 - 不要直接运行包内的单个Python文件(比如直接执行
python AB.py),直接运行的文件会被识别为入口脚本,不属于包结构的一部分,会导致相对导入失效。如果需要测试Elements下的文件功能,在App目录的同级目录执行模块运行命令即可,比如测试AB.py:
python -m App.Core.Controllers.Components.Elements.AB
- 如果项目有统一启动入口,把入口文件放在App目录的同级位置,直接从入口启动即可正常识别所有相对导入。
内容的提问来源于stack exchange,提问作者nayang
相关产品推荐
相关产品推荐

