Debian软件包如何从PyPI安装Python模块

这个问题试图补充这个问题。 我有一个python应用程序,它使用PyPI的第三方模块。 我想将我的应用程序打包成debian包,但不知道如何处理不在debian / ubuntu存储库中的python依赖项(也包装为debian包)

解决方案#1:
从PyPI构建模块直接进入我的debian包。

解决方案#2:
使用stdeb为我需要的所有PyPI模块创建debian包,并将它们添加到debian / ubuntu存储库。

我实际上需要一个解决方案#3,因为我想在安装我的debian软件包时安装PyPI依赖项,最好是进入virtualenv!

什么是解决方案#3 ? 我是否需要调整DEBIAN / preinst维护者脚本?

我在Debian IRC频道irc://irc.debian.org#debian-mentors上与一些维护人员交谈 ,要求完全相同的事情,并且普遍的共识是:

解决方案#1:

通过将源文件作为单个代码库复制而在包中集成依赖关系是非常不满意的。 它会破坏处理依赖关系,更新,版本控制等的打包系统的目的。

解决方案#3:

安装二进制文件( .deb )时即时下载非debian软件包是一个严重的安全风险,绝对是禁止的。 您甚至无法通过提取deb检查依赖项,因为它们是在安装时下载并安装的。 这是一种完全绕过存储库系统的方法。 没有关心的用户会对在幕后(以root记住!)的软件包感到高兴,从不受信任的来源下载其他不受信任的软件。 是的,这需要摆弄DEBIAN/postinst (或preinst )并发布wget (或者,在你的情况下, pip install ),这就是Flash,Oracle Java,Steam等采用的方法。 但这是专有的闭源软件,所以无论如何他们的安全性都没有。

解决方案#1.5:

你没有提到它,但你可以只在构建时集成依赖项,即在包( .orig.tar.gz.debian.tar.gz.dsc三元组)中通过从PyPi下载时集成。创建“二进制”包( .deb )。 pip install的说明将进入debian/rules (注意小写debian ,而不是二进制包),并在发出debuilddpkg-buildpackage

这是#1和#3之间的中间地带。 它减轻了(但没有解决!)#3的一些问题:至少你可以检查最终产品,而.deb在安装时不需要访问互联网。 所有风险和负担都从最终用户转移到包维护者。 但是,它与#1具有相同的问题,因为它绕过了大多数包装系统基础设施。 毕竟,处理依赖关系(版本,更新,要求,冲突)是为什么首先创建dpkg / apt原因! 🙂

解决方案#2:

One True Right Way™ 。 您为依赖项创建debian包,将它们列为包中的需求,并发送所有.debs或源包。

从那里,您有许多选择:

  • 提交源软件包,包括您的软件及其依赖项,以包含在Debian中。 如果被接受,它们将自动供所有Debian用户使用,包括Ubuntu等所有衍生产品。

  • 将源包上传到Launchpad ,从而创建一个PPA ,任何Ubuntu用户(及其衍生品,如Linux Mint)都可以轻松添加和安装

  • 在您的网站上托管您自己的debian存储库,任何基于Debian的系统的用户都可以添加到他们的/etc/apt/sources.list.d并使用apt基础设施来下载,安装和保持更新(如上所述!)

  • 托管.deb文件以供直接下载和安装。 没有涉及到apt或自动更新的想法。

至于如何打包你的PyPi依赖项(以及你的python软件!),有许多工具和参考可以简化这个过程:

  • stdeb ,如你所说。 老人和礼物。

  • Pybuild ,一个来自Debian的新工具,取代了stdeb

许多有用的参考:

  • 包装Python库的样式指南

  • Debian Python策略

需要帮忙? 看看那些:

  • Debian Mentors常见问题解答

  • Python包装团队

我想你只需要将相关的命令行代码添加到.deb包中的postinst脚本中。 在这个答案中找到了更多详细信息,请访问官方debian指南 。

他们没有,就像perl中的cpan一样,如果你有存储库,你可以用apt-get安装,如果没有你可以用pip安装,差别应该是pip install在/ usr / local。

要使用pip安装,您可以:

 apt-get install python-pip pip install foopackage 

例如:

 pip install MultipartPostHandler2