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

18

我有一个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


手动安装模块需要一些技能,所以对于客户来说可能会太困难。 - ForceBru
2
是的,这正是我想要尽量减少努力的原因。 - jotrocken
这些是git子模块,还是你只是用“submodule”这个名称来表示一个带有Python模块的子目录? - chrisinmtown
说实话,我不记得@chrisinmtown。 - undefined
2个回答

6

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

你的 setup.py 应该如下所示:

from setuptools import setup, find_packages

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

4
创建一个名为mysubmodule的包并拥有它自己的setup.py,让顶层包在其setup.py中依赖于该包。这意味着您只需要使包/依赖项可用,并在顶层包上运行python setup.py install
然后问题变成如何将依赖项/包发送给客户,但这可以通过将它们放入目录并在搜索依赖项时配置setup.py以包含该目录来解决。
另一种选择是"vendor" mysubmodule,简单地将其全部包含在一个包中(无需进一步询问),并安装主要包时只需要运行一个python setup.py install。例如,pip会“vendor”(包含)requests,因此可以使用它而无需依赖于该requests包。

17
请问您能否提供有关如何在顶层包的setup.py中指定依赖项的更多细节? - dPol
2
具体来说,您可以编辑 setup.py 文件以指定安装子模块作为依赖项,从而回答这个问题。 - Scott Smith
除了这个答案,还有一些更详细的信息可以在这里找到:https://softwareengineering.stackexchange.com/questions/365579/how-do-i-deal-with-projects-within-projects-in-python?newreg=7f2e49cd2c7c4efe9c57380e586d4aa0 - logicOnAbstractions
很难理解为什么这是被接受的答案.. OP 明确表明 mysubmodule 已经有了它自己的 setup.py。在顶层的 setup.py 中需要什么额外的魔法呢? - chrisinmtown

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接