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

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

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

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

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

我确实需要一个解决方案 #3因为我想在安装我的 debian 包时安装 PyPI 依赖项,最好是安装到虚拟环境中!

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

答案1

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

解决方案#1:

通过将依赖项的源文件复制为单个代码库来集成到包中非常不赞成。这会破坏处理依赖关系、更新、版本控制等的打包系统的目的。

解决方案 #3:

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

解决方案 #1.5:

你没有提到,但你只能在构建时间即在来源软件包(.orig.tar.gz.debian.tar.gz.dsc三元组),在创建“二进制”软件包(.deb)时从 PyPi 下载。 的指令pip install将进入debian/rules(请注意小写的debian,而不是二进制软件包),并将在您发出debuild或时执行dpkg-buildpackage

这是 #1 和 #3 之间的折衷方案。它缓解了(但并未解决!)#3 中的一些问题:至少您可以检查最终产品,并且.deb在安装时不需要互联网访问。所有风险和负担都从最终用户转移到软件包维护者。但是,它存在与 #1 相同的问题,因为它绕过了大部分打包系统基础设施。毕竟,处理依赖关系(版本、更新、要求、冲突)是dpkg/apt最初被创建的原因!:)

解决方案 #2:

唯一正确方法™。您可以为您的依赖项创建 Debian 包,将它们列为您的包中的要求,并发送所有.debs或源包。

从那里,您有多种选择:

  • 提交源包(包括您的软件及其依赖项)可纳入 Debian。如果被接受,它们将自动可供所有 Debian 用户使用,包括所有衍生产品(如 Ubuntu)。

  • 将源码包上传至发射台,从而创建一个电力供应协议任何 Ubuntu 用户(以及 Linux Mint 等衍生产品)都可以轻松添加和安装

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

  • 托管.deb文件以供直接下载和安装。无需apt考虑自动更新。

至于如何要打包你的 PyPi 依赖项(以及你的 Python 软件!),有许多工具和参考资料可以使这个过程变得简单:

  • 标准普尔就像您提到的那样。经典之作。

  • Pybuild,Debian 推出的一个令人惊叹的新工具,它取代了stdeb

还有许多有用的参考资料:

需要帮助?请查看:

答案2

可以pypi2deb从pypi获取一个包并将其制作成deb包。

答案3

我认为你只需要将相关的命令行代码添加到 .deb 包中的 postinst 脚本中即可。这个答案,更多详情请参阅官方 Debian 指南

答案4

使用dh-虚拟环境它将把 pip 项目打包成带有 virtualenv 的 Debian 包(包含所有依赖项)。

sudo apt install dh-make dh-virtualenv

你需要一个带有setup.py(和pyproject.tomlrequirements.txt) 的 Python 项目。在该项目内生成debian/目录,例如使用:

dh_make --indep --createorig --native --packagename mypackage_0.1.0

删除示例文件:

rm debian/*.ex debian/*.EX debian/README.*

更新构建依赖项debian/control

Build-Depends: debhelper (>= 11), python3, dh-virtualenv (>= 1.0)

编辑debian/rules

%:
      dh $@ --with python-virtualenv

最后尝试使用以下命令构建包:

( deactivate ; dpkg-buildpackage -us -uc -b )

文献更多细节。

相关内容