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

Python多子包Monorepo配置问题求助:安装后子包显示与导入异常

Python多子包Monorepo配置问题求助:安装后子包显示与导入异常

嗨,我来帮你梳理下这个monorepo配置的问题,先理清楚你的现状和核心矛盾点:

你的项目结构

monorepo/
├── sub_pkg1/
│   ├── sub_pkg1/
│   │   ├── __init__.py
│   │   └── func.py  # 包含类A
│   └── setup.py     # sub_pkg1的配置文件
├── sub_pkg2/
│   ├── sub_pkg2/
│   │   ├── __init__.py
│   │   └── func.py  # 包含类B
│   └── setup.py     # sub_pkg2的配置文件
└── setup.py         # monorepo根目录的配置文件

你的操作流程

  • 在monorepo目录下创建并激活虚拟环境:
    python -m venv .venv
    source .venv/bin/activate
    
  • 更新pip、setuptools,安装ipython用于测试
  • 执行根目录下的开发模式安装:python -m pip install -e .

遇到的异常现象

  1. 用pip list查看已安装包时,只显示monorepo,看不到sub_pkg1和sub_pkg2
  2. 但进入ipython后,无法导入monorepo,反而能直接导入sub_pkg1和sub_pkg2

问题根源分析

你的根目录setup.py存在两个关键配置错误:

  1. package_dir路径配置错误:你写的"sub_pkg1": "sub_pkg1/sub_pkg1"会让setuptools把sub_pkg1识别为根级别包(而非monorepo的子包),所以能直接导入,但monorepo本身没有对应的包目录,自然无法导入。
  2. 子包注册逻辑错误:你希望sub_pkg1和sub_pkg2作为独立包被pip识别,但当前根setup.py是把它们当作monorepo的内部模块打包,而非独立注册的包。

解决方案:两种实现思路(满足你的核心需求)

思路1:让sub_pkg1和sub_pkg2作为独立包安装(完全匹配你的需求)

如果你希望执行pip install -e .后,sub_pkg1和sub_pkg2都出现在pip列表里,并且能直接导入,推荐按以下步骤调整:

步骤1:修正子包的setup.py

  • sub_pkg1/setup.py(简化配置,用find_packages自动识别包):
from setuptools import setup, find_packages

if __name__ == "__main__":
    setup(
        name="sub_pkg1",
        version="0.0.2",
        packages=find_packages()  # 自动扫描sub_pkg1目录下的包结构
    )
  • sub_pkg2/setup.py(注意你之前写错了packages_dir,正确参数是package_dir,这里直接用find_packages更省心):
from setuptools import setup, find_packages

if __name__ == "__main__":
    setup(
        name="sub_pkg2",
        version="0.0.2",
        packages=find_packages()
    )

步骤2:修改根目录的setup.py,关联子包作为可编辑依赖

根目录setup.py配置成元包,将两个子包作为可编辑依赖引入:

from setuptools import setup

if __name__ == "__main__":
    setup(
        name="monorepo",
        version="0.0.2",
        install_requires=[
            "sub_pkg1 @ file://./sub_pkg1",
            "sub_pkg2 @ file://./sub_pkg2"
        ],
        include_package_data=True
    )

执行pip install -e .后,pip会把sub_pkg1和sub_pkg2作为独立包安装到虚拟环境,monorepo作为元包存在,你既可以直接导入sub_pkg1/sub_pkg2,pip list里也会显示这三个包。

思路2:让sub_pkg1和sub_pkg2作为monorepo的子包(可选方案)

如果你希望导入路径是from monorepo import sub_pkg1,可以调整项目结构和配置:

  1. 调整项目目录结构:
monorepo/
├── monorepo/
│   ├── __init__.py
│   ├── sub_pkg1/
│   │   ├── __init__.py
│   │   └── func.py
│   └── sub_pkg2/
│       ├── __init__.py
│       └── func.py
└── setup.py
  1. 根setup.py配置:
from setuptools import setup, find_packages

if __name__ == "__main__":
    setup(
        name="monorepo",
        version="0.0.2",
        packages=find_packages(),
        package_dir={"": "."}
    )

安装后,你可以通过import monorepo.sub_pkg1导入模块,pip list里只会显示monorepo。

验证方法

执行完配置修改和pip install -e .后,进入ipython测试:

  • 思路1:执行import sub_pkg1和import sub_pkg2,应该能成功;pip list能看到这两个包。
  • 思路2:执行import monorepo.sub_pkg1,能成功导入模块。

备注:内容来源于stack exchange,提问作者doomsk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 15:08:15