You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

嵌套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 -m submodule_1.main
    
    这种方式会让Python将submodule_1识别为包,相对导入会自动定位到同级的submodule_2。
  • 在main_project中运行:submodule_1作为子包存在,相对导入会正确指向其内部的submodule_2子包,无需额外修改。

方案2:将子模块转为可安装Python包

通过pyproject.toml将三个项目都配置为可安装包,用依赖关联Git子模块目录,彻底摆脱导入路径限制。

配置步骤

  1. submodule_2根目录创建pyproject.toml:
[build-system]
requires = ["setuptools>=61.0"]
build-backend = "setuptools.build_meta"

[project]
name = "submodule_2"
version = "0.1.0"
  1. 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",
]
  1. 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",
]
  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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 11:35:19