Setuptools 从 git 子模块安装代码

Posted

技术标签:

【中文标题】Setuptools 从 git 子模块安装代码【英文标题】:Setuptools installing code from git submodules 【发布时间】:2021-01-01 15:52:47 【问题描述】:

我有一个 Python 库,我正在尝试为 PyPi 打包,其中包含几个指向外部存储库的 git 子模块。比如:

MyLibrary
 - setup.py
 - MyLibrary
   - __init__.py
   - my_code1.py
   - my_code2.py
   - submodules
     - __init__.py
     - git submodule https://www.github.com/external/repository1
        - repository1_code.py
     - git submodule https://www.github.com/external/repository2
        - repository2_code.py

我的setup.py 文件看起来像:

from setuptools import setup, find_packages

setup(
    name='MyLibrary',
    ...
    packages=find_packages(),
    ...,
    install_requires=["numpy", "scipy"]
)

我遇到的问题是当我使用 pip 安装这个库时,我的所有代码和子文件夹都安装得很好,但是缺少子模块;它们没有被初始化/拉入,也没有出现在安装的文件夹中,既不是子模块文件夹也不是内部代码(例如repository1_code.py)。

有没有办法在安装代码之前指示setup.py 扩展子模块,即git submodule update --init --recursive

【问题讨论】:

您的子模块的根目录是否有__init__.py? (find_packages 必须进入其中) 谢谢,这是我没有想到的一种解决方案。 那行得通吗?我应该将其转换为答案吗? 你也可以试试find_namespace_packages()__init__.py 不那么挑剔,因此它可能适用于您的用例,但当然它也有副作用。 【参考方案1】:

感谢对该问题的最高评论,一个解决方案是分叉所有子模块并在所有需要的文件夹中放置一个__init__.py。虽然这不是最优的,因为我宁愿不必分叉和修改子模块,而是使用原始模块。

另一种解决方案是不使用find_packages(),而是简单地显式写出子模块中的所有文件夹。这有点不方便,但效果很好,并且似乎是迄今为止我找到的最佳解决方案。

【讨论】:

以上是关于Setuptools 从 git 子模块安装代码的主要内容,如果未能解决你的问题,请参考以下文章

RestKit 作为 Git 子模块安装后出现错误

如何安装 MySQLdb 包? (ImportError:没有名为 setuptools 的模块)

为啥安装setuptools会提示没有setuptools模块?

通过GIT安装私有NPM模块,并让它更新?

将公共代码添加为 git 子模块的问题:“索引中已存在”

python setuptools 为啥安装模块安装不上是我本来setuptools就安装失败了么