我应该用我的Python应用程序捆绑C库吗?

时间:2011-01-15 14:47:09

标签: python c distutils

如果我有一个依赖于某些C库的Python包(比如用于数值计算的Gnu Scientific Library(GSL)),那么将库与我的代码捆绑在一起是个好主意吗?

我想让我的软件包尽可能易于安装给用户,我不希望他们必须手动下载C库并提供include-paths。此外,我始终可以确保我发布的库版本与我的代码兼容。

但是,如果用户已经安装了库,是否可能存在冲突,或者是否有任何其他原因导致我不应该这样做?

我知道我可以通过提供二进制分发使用户更容易,但我想避免为所有可能的操作系统维护二进制分发。所以,我想坚持使用源代码分发,但对于用户(自豪地拥有C编译器),安装应该像python setup.py install一样简单。

3 个答案:

答案 0 :(得分:4)

分销是任何软件项目的难点之一。 Java和.NET通过定义标准运行时,然后只是说“只分发其他所有内容”来解除部分负担。当然有一个缺点:一切都必须用运行时支持的语言重写 - 只要你想使用本机代码,就会失去所有的优势。

这在Python中更难,因为它在Ruby,C,C ++和其他语言中,因为它们通常利用现有的本机库。

一般来说:

  1. 通过pypi.python.org作为示例,可以获得源sdist。正确设置你的install_requires(可能你需要GSL的python绑定,而不是GSL本身)。使用标准的setuptools / distribute布局。这将让任何人 - 让我们说任何发行版的软件包维护者 - 拿起你的软件并打包它。

  2. 此外,请考虑为您的受众群体提供完整的可安装程序包。您不必支持所有发行版和操作系统;选择你认为最常用的一两个。像PyInstaller这样的工具可以让你为许多操作系统创建一个可安装的,可运行的包,但是对于linux你可能希望用户安装发行版自己的传递deps版本(libgsl?) - 你需要一个完整的-blown deb或rpm包以满足这一点 - 再次,不要尝试支持任何和所有的发行版,你会变得疯狂。支持您最常使用的东西,并让其他用户帮助您满足其他包装需求。

  3. 另请查看Python Packaging Guide

答案 1 :(得分:0)

你可以有两个独立的src分支,一个包含库,另一个不包含库。这样,您可以明确地警告您的用户,以防他们安装了库。另一个解决方案可能是(如果库的许可证允许你)将它们包装在一个文件中。

我认为没有独特的解决方案,但这是我到目前为止所能想到的想法。

祝你好运

答案 2 :(得分:0)

您可以使用virtualenv为您的应用程序创建私有Python环境。这避免了与其他库的冲突。最好使用Distribute打包模块和依赖项,例如库。 Distutils是值得研究的其他东西。