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 子模块安装代码的主要内容,如果未能解决你的问题,请参考以下文章
如何安装 MySQLdb 包? (ImportError:没有名为 setuptools 的模块)