如何从 Python 中的子模块安装依赖项?

How to install a dependency from a submodule in Python?

我有一个具有以下结构的 Python 项目(为简单起见省略了不相关的源文件):

myproject/
    mysubmodule/
        setup.py
    setup.py

文件 myproject/setup.py 使用 distutils.core.setup 安装模块 myproject 和相关源。但是,myproject 需要安装 mysubmodule(这是一个 git 子模块)。所以我现在正在做的是:

myproject/$ cd mysubmodule
myproject/mysubmodule/$ python setup.py install
myproject/mysubmodule/$ cd ..
myproject/$ python setup.py install

这对客户来说太乏味了,尤其是如果项目将来会通过更多的子模块进行扩展。

有没有办法在调用 myproject/setup.py 时自动安装 mysubmodule

mysubmodule 创建一个包含 setup.py 的包,并让顶级包在其 setup.py 中依赖于该包。这意味着您只需要使包/依赖项可用,并在顶级包上 运行 python setup.py install

然后问题变成了如何将依赖项/包发送给您的客户,但这可以通过将它们放在一个目录中并配置 setup.py 以在搜索依赖项时包含该目录来解决。

另一种方法是 "vendor" mysubmodule,这只是意味着将其全部包含在一个包中(不再问其他问题),并有一个 python setup.py install 来安装主包。例如,pip 供应商(包括)requests 因此它可以使用它而不必依赖那个 requests 包。

setuptools.find_packages() 能够发现子模块

你的setup.py应该看起来像

from setuptools import setup, find_packages

setup(
    packages=find_packages(),
# ...
)