嵌套Git子模块结构下Python包模块的可靠导入方案问询
兼容Git子模块场景的Python包导入方案
问题核心
submodule_1存在两种运行场景:
- 作为独立项目时,submodule_2是同级包,需用
from submodule_2 import *导入 - 作为main_project的Git子模块时,submodule_2是submodule_1的子包,原导入路径会报错;改成
from submodule_1.submodule_2 import *又无法独立运行submodule_1
以下是两种可靠的兼容方案:
方案1:使用Python相对导入
修改submodule_1中的导入语句为相对导入格式:
from .submodule_2 import *
适配两种场景的运行方式
- 单独运行submodule_1:必须以模块方式启动脚本,而非直接执行文件。例如submodule_1根目录下有
main.py,则运行:
这种方式会让Python将submodule_1识别为包,相对导入会自动定位到同级的submodule_2。python -m submodule_1.main - 在main_project中运行:submodule_1作为子包存在,相对导入会正确指向其内部的submodule_2子包,无需额外修改。
方案2:将子模块转为可安装Python包
通过pyproject.toml将三个项目都配置为可安装包,用依赖关联Git子模块目录,彻底摆脱导入路径限制。
配置步骤
- submodule_2根目录创建
pyproject.toml:
[build-system] requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta" [project] name = "submodule_2" version = "0.1.0"
- submodule_1根目录创建
pyproject.toml:
[build-system] requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta" [project] name = "submodule_1" version = "0.1.0" dependencies = [ "submodule_2 @ file://./submodule_2", ]
- main_project根目录创建
pyproject.toml:
[build-system] requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta" [project] name = "main_project" version = "0.1.0" dependencies = [ "submodule_1 @ file://./submodule_1", ]
- 安装可编辑版本:
分别在submodule_2、submodule_1、main_project的根目录执行:
pip install -e .
效果
- 单独运行submodule_1时,submodule_2已作为依赖包被识别,
from submodule_2 import *可正常执行。 - 在main_project中运行时,submodule_1和submodule_2都以包形式存在,导入语句不受目录结构影响。
内容的提问来源于stack exchange,提问作者clel
相关产品推荐
相关产品推荐

