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


20

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

解决方案1:
将PyPI中的模块直接构建到我的debian软件包中。

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

我实际上需要一个解决方案#3,因为我想在安装Debian软件包时安装PyPI依赖项,最好将其安装到virtualenv中!

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


您能描述为什么需要创建Debian软件包吗?您的Python应用是否需要非Python资源?
乔纳森

@Jonathan我希望用户能够从Ubuntu软件中心安装我的应用程序。我想我需要一个* .deb。我的Python应用程序不需要非Python资源,只需第三方python模块。
andri_ch 2013年

@Jonathan Debian软件包是Ubuntu中的标准安装方法。可以轻松分发.deb文件,或在启动板中设置专用存储库或PPA。
MestreLion 2014年

Answers:


20

我已经在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,而不是二进制包),并在发出debuild或时执行dpkg-buildpackage

这是介于#1和#3之间的中间立场。它可以缓解(但不能解决!)#3的某些问题:至少您可以检查最终产品,并且.deb在安装时不需要Internet访问。所有风险和负担都从最终用户转移到包装维护者。但是,它具有与#1相同的问题,因为它绕过了大多数包装系统基础结构。毕竟,处理依赖关系(版本,更新,需求,冲突)是为什么dpkg/ apt首先创建的原因!:)

解决方案2:

一个真正正确的方式™。您可以为依赖项创建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

以及许多有用的参考资料:

需要帮忙?检查那些:



2

pypi2deb一个从pypi获得的软件包,并使其成为deb软件包。


0

它们不是,就像perl中的cpan一样,如果您在存储库中,则可以使用apt-get进行安装,否则,可以使用pip进行安装,不同之处在于pip可以安装在/ usr / local中。

要安装pip,您可以执行以下操作:

apt-get install python-pip 
pip install foopackage 

例如:

pip install MultipartPostHandler2

这不能回答OP的问题。问题是如何让Debian软件包从PyPi安装Python软件包,以便'apt-get <custom-package>'或'dpkg -i <custom-package>'从PyPi中提取python依赖项。
SevakPrime

它们不是,就像perl中的cpan一样,如果您在存储库中,则可以使用apt-get进行安装,否则,可以使用pip进行安装,不同之处在于pip可以在/ usr / local下安装,但也许它将最好删除我的答案。
塞尔吉奥

您的评论为OP的问题提供了适当的答案。您应该在评论中添加该评论以得到投票。(例如,请参阅MestreLion的答案。)照原样,您的答案无法回答OP的问题。
SevakPrime '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.