Python3.6+:如何将项目高层模块导入至底层文件?
从高层级模块导入到低层级文件的合理方案(Python 3.6+)
刚好在项目里处理过类似的导入问题,给你整理几个靠谱的方案,尤其适合你这种utilities_package被全项目广泛使用的场景:
方案一:临时把项目根目录加入Python路径(快速解决)
Python查找模块是基于sys.path里的路径列表,所以咱们可以手动把项目根目录加到这个列表里。在demo_file.py的开头加上这段代码:
import sys from pathlib import Path # 计算项目根目录:从demo_file.py往上跳4层(demo_sub_sub_package → demo_sub_package → demo_package → 根目录) project_root = Path(__file__).parent.parent.parent.parent sys.path.append(str(project_root)) # 现在就能正常导入了 from utilities_package import util_one, util_two
这个方法简单直接,适合临时测试或者小型项目,但要注意:如果后续项目结构调整了,比如层级变了,那这个往上跳的层数得跟着改,不然会报错。
方案二:把项目安装为可编辑包(推荐长期使用)
这是最专业也最省心的方案,尤其适合需要长期维护、多人协作的项目。步骤如下:
- 在项目根目录(
E:\demo_proj)下创建一个pyproject.toml文件(Python3.6+支持,比老的setup.py更现代),内容如下:
[build-system] requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta" [project] name = "demo_proj" version = "0.1.0" packages = ["utilities_package", "demo_package"]
- 打开命令行,进入项目根目录,执行以下命令:
pip install -e .
这个命令会把你的项目安装成可编辑模式的Python包,意思是你修改项目里的代码,不需要重新安装就能生效。
之后不管你在项目里哪个文件(包括demo_file.py),都可以直接导入:
from utilities_package import util_one, util_two
这个方案的好处是完全不用管文件层级,只要包结构正确就能导入,团队里其他人克隆项目后,只需要执行一遍pip install -e .就能同步环境,非常方便。
避坑提醒:别用相对导入跨顶级包
很多人会想着用相对导入(比如from ...utilities_package import ...)来解决,但要注意:相对导入只能在同一个顶级包内部使用。你的utilities_package和demo_package是项目根目录下的两个独立顶级包,跨包用相对导入会直接报错,别踩这个坑!
内容的提问来源于stack exchange,提问作者Toothpick Anemone
相关产品推荐
相关产品推荐

