跨多个setup.py脚本分享代码的最佳方法是什么?

4

我正在开发几个软件包,希望能够在它们的setup.py脚本之间共享代码。有没有好的方法可以做到这一点,或者说代码重复是唯一的选择?


1
作为独立的软件包,它们必须能够引用共享代码... 您可以在软件包中创建对此共享代码的依赖项,强制用户(或软件包管理器)首先安装依赖项,否则在每个软件包内部重复该代码。对于本地的、内部的软件包,您可以尝试任意导入,但这只是一种权宜之计。 - Nisan.H
1
@Nisan.H:实际上,你可以指示安装程序获取设置依赖项,请参见我下面的答案。 - Martijn Pieters
1个回答

8
通常情况下,setup.py是分发独立软件包的入口点。因此,在这些软件包之间分享代码变得困难。
如果你在setup.py中使用setuptools(或者它的分支distribute),你可以使用setup_requires条目指定安装你的软件包时必须安装的软件包。
不幸的是,setup.py会首先被执行;一旦解析了setup_requires行,列出的额外软件包将被安装到本地,但这可能对你的需求来说太晚了。
解决方法是在调用setup之前创建一个单独的Distribution对象,该对象定义setup_requires条目。
import setuptools

setuptools.dist.Distribution(dict(setup_requires='yoursharedsetuppackage'))
# `setup_requires` is parsed and acted upon immediately; from here on out
# the yoursharedsetuppackage is installed and importable.

import yoursharedsetuppackage

setup(...)

这个解决方案似乎会在setup_requires中包含numpy时进行编译。有没有一种使用pip安装numpy的方法呢? - aaragon
@aaragon:你为什么需要把numpy作为设置要求呢?如果你确实需要,那么为了确保安装成功,它会首先被安装。如果可能避免使用该需求(通过使用不需要numpy来创建设置的Python代码),那么就这样做吧。 - Martijn Pieters
我正在创建一个既可以用作库又可以用作应用程序的程序库,因此对于最终用户,我需要一种简单明了的方法来安装依赖项。我考虑使用setup.py来实现这一点,但它并没有从二进制文件中安装numpy,而是构建了它。有什么建议吗? - aaragon
@aargon:那就直接使用install_requires,而不是setup_requiressetup_requires是用于在安装脚本本身中需要使用的依赖项。 - Martijn Pieters
也许你能帮我一下这个帖子吗?(https://stackoverflow.com/questions/46697117/how-do-i-make-setup-py-play-nice-with-code-thats-both-a-library-and-an-applicat) - aaragon

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