有没有一种标准的方法来创建用于分发 Python 程序的 Debian 包?

Posted

技术标签:

【中文标题】有没有一种标准的方法来创建用于分发 Python 程序的 Debian 包?【英文标题】:Is there a standard way to create Debian packages for distributing Python programs? 【发布时间】:2011-10-29 22:48:08 【问题描述】:

有大量关于如何做到这一点的信息,但是由于“给猫剥皮的方法不止一种”,所有的教程/手册都涵盖了这个过程似乎做了一些与其他教程不同的假设,我仍然没有掌握它。

到目前为止,这是我认为我理解的。

    我的最终目标应该是创建一个“二进制”.deb 包。这样的包将是平台无关的(32/64 位),因为所有 Python 程序都是如此。 要创建“二进制”包,我首先需要创建一个源包。 要创建源包,我可以使用CDBSdebhelper。 Debhelper 是初学者的推荐方式。 创建源包的核心是在源目录中的DEBIAN 目录中填充许多文件,这些文件说明需要复制文件的位置、它们受制于什么版权和许可方案、它们具有什么依赖项等... 第 4 步可以在很大程度上自动化 dh_makecommand 如果 Python 源代码还带有 distutils 的 setup.py 脚本。

现在我的问题:

    我对流程的理解是否正确?我是否遗漏了什么,或者我做错了什么? 第 5 步确实让我更加困惑:特别是对我来说最模糊的两点是: 我如何编写一个安装独立程序的setup.py 脚本? 编辑: 独立程序我的意思是一个程序旨在由桌面用户使用(与 module 不同,我理解它是导入后由其他软件使用的功能集合)。在我的具体情况下,我实际上需要两个这样的“程序”:主软件和一个单独的实用程序(实际上是第二个“程序”,它应该与另一个程序在同一个包中)。 这种 DEB 包脚本的特殊性是什么?官方文档似乎只处理 RPM 和 Windows 的东西......

顺便说一句:这些是迄今为止我能找到的最好的信息来源。如果你有什么比这更好的,请分享! :)

Ubuntu's Python packaging guide Creating a .deb package from a python setup.py(它显示这些步骤,但它解释不足以让我跟随) ShowMeDo video on "creating a .deb package out of a python program"(它似乎不是最新的,并且 - 如果我做对了 - 将生成供个人使用的包,没有依赖关系 并且没有签名的变更日志和其他使其与 Debian 政策不兼容的关键数据)。

【问题讨论】:

在为二进制打包准备一个python程序之前,您需要为一般分发做好准备。那是setup.py 位。这与许多 GNU C/C++ 项目使用的 autotools 步骤相当,但特定于 python。这比听起来容易,阅读docs.python.org/distutils/index.html @TokenMacGuy - 谢谢,我已经大致了解(我的措辞可能不正确,但这是我描述的过程的第 5 部分)。令我困惑的是,在官方文档中,我找不到关于如何分发独立程序而不是模块的明确方法。也许这只是一个术语问题,而我所说的“独立程序”是一种特定类型的模块? @mac:您可以安装脚本,即可执行文件来启动您的程序。见docs.python.org/distutils/setupscript.html#installing-scripts @Thomas - 我以前读过,但我仍然感到困惑:我的程序有一个 main.py 文件(我想你可能称之为“脚本”)和一系列模块和其他一些YAML 和 SVG 文件...我仍在努力寻找有关如何实现这一目标的明确文档。到目前为止我能找到的最好的是distutils tutorial,我还在学习... 独立程序是指没有python作为依赖项的东西吗? Debian 和 Ubuntu 的最新版本都至少带有 python 2.6,因此如果您的代码与 2.6 兼容,那么正如您所建议的,“独立程序”实际上可能只是模块的一个特例。 【参考方案1】:

看起来stdeb 会做你想做的事。

另外,对于安装脚本,我强烈推荐distribute's console_scripts 入口点支持。

【讨论】:

非常非常非常有用,谢谢! (+1) 我将在未来几天测试这条路并报告。 这确实是要走的路(至少对我来说)。再次感谢您,回答已接受。 “分发的控制台脚本”链接不起作用。 @CzarekTomczak,也许是this will help。 我有一个手写的DEBIAN/control。有没有办法让stdeb使用它?【参考方案2】:

构建deb包的正确方法是使用dpkg-buildpackage,但有时会有点复杂。相反,您可以使用 dpkg -b <folder>,它会创建您的 Debian 软件包。

这些是使用dpkg -b <folder> 使用任何二进制文件或任何无需手动编译自动运行的脚本(Python、Bash、Perl 和 Ruby)创建 Debian 软件包的基础知识:

    创建文件和文件夹以重新创建以下结构:

     ProgramName-Version/
     ProgramName-Version/DEBIAN
     ProgramName-Version/DEBIAN/control
     ProgramName-Version/usr/
     ProgramName-Version/usr/bin/
     ProgramName-Version/usr/bin/your_script
    

    /usr/bin/处的脚本是直接从终端调用的,注意我没有给脚本添加扩展名。您还可以注意到,deb 包的结构将是安装后程序的结构。所以如果按照这个逻辑,如果你的程序只有一个文件,你可以直接放在ProgramName-Version/usr/bin/your_script下,但是如果你有多个文件,你应该把它们放在ProgramName-Version/usr/share/ProgramName/all your files下,只把一个文件放在/usr/bin/下。从/usr/share/ProgramName/调用你的脚本

    将所有文件夹权限改为root:

     chown root:root -R /path/to/ProgramName-Version
    

    更改脚本的权限:

     chmod 0755 /path/to/the/script
    

    最后,您可以运行:dpkg -b /path/to/the/ProgramName-Version,您的 deb 包将被创建! (你也可以添加 post/pre inst 脚本和你想要的一切,它就像一个普通的 Debian 包一样工作)


这是control 文件的示例。您只需将其复制粘贴到一个名为“control”的空文件中,并将其放入 DEBIAN 文件夹中。

Package: ProgramName
Version: VERSION
Architecture: all
Maintainer: YOUR NAME <EMAIL>
Depends: python2.7, etc , etc,
Installed-Size: in_kb
Homepage: http://example.com
Description: Here you can put a one line description. This is the short Description.
 Here you put the long description, indented by one space.

关于Debian软件包的完整文章可以阅读here。

【讨论】:

这个解决方案正是我在尝试使用stdeb 构建需要pyqt5 的python3 包后遇到的障碍。非常感谢拉斐尔。此外,对于不小心点击了此解决方案上的否决投票按钮,我深表歉意——我似乎无法更改我的投票。 我刚刚尝试再次单击反对票(以及赞成票),我收到以下消息:您最后一次对此答案投票是 11 月 17 日 21:25。除非编辑答案,否则您的投票现在已锁定。 也许如果您编辑了答案,我可以更改我的投票?再次感谢@rsm 的回答。它帮助我为 manuskript 创建了一个 DEB 包。 有没有办法用这种方法改变安装路径?我只能找到一种更改前缀的方法(在规则文件中使用override_dh_auto_install),但不能自定义整个路径 @ignacio 正如我所说,deb 包的结构将被部署到安装中。您完全无需使用任何您想要的路径。【参考方案3】:

This article by Barry Warsaw 帮助我完成了整个过程。不过,我仍然需要进行大量搜索,而且我在过去的某个时间阅读了大部分 Ubuntu packaging guide。

拥有一个好的setup.py 是一个非常好的建议。我发现这两个指南非常好:

Hitchhiker's Guide to Packaging Distribute documentation

【讨论】:

请注意,Hitchhiker's Guide 已被 Python Packaging User Guide 取代。 哦,谢谢!虽然,它们都只涵盖了 distutils 的非常简单的基础知识。 Distribute 文档有更多详细信息,地址为 the recommended solution(在撰写此评论时)。 Barry 的博客已更新并推荐 wiki.debian.org/Python/LibraryStyleGuide 指南。它对我有用。 适用于 python 的 Ubuntu 打包指南不再起作用。【参考方案4】:

那里有几个库可以抽象出所有必要的步骤,让您只需一个命令即可将 Python 包转换为 Debian 包。

假设你的python包已经有了setup.py,在setup.py所在的目录下,你可以使用:

stdeb(已在此answer 中提及,使用pip install stdeb 安装)。要创建 Debian 软件包,请运行:

python setup.py --command-packages=stdeb.command bdist_deb

输出的.deb 文件将位于bdist_deb 目录中。

fpm(使用gem install --no-ri --no-rdoc fpm 安装)。要创建 Debian 软件包,请运行:

fpm -s python -t deb setup.py

py2deb(使用pip install py2deb 安装)。要创建 Debian 软件包,请运行:

py2deb -r . .

这些库中的每一个都有自己的注意事项,因此您可能想尝试最适合您的方法。

【讨论】:

【参考方案5】:

这个方法对我有用。

    安装标准数据库。 (pip install stdeb)

    创建 setup.py。我正在使用 PyCharm。这将 (https://www.jetbrains.com/help/pycharm/creating-and-running-setup-py.html) 将这些命令写入您的项目目录中。

    sudo apt-get install python3-stdeb fakeroot python-all python3 setup.py sdist sudo python3 setup.py --command-packages=stdeb.command bdist_deb 您的 deb 文件位于项目中的 deb_dist 目录中

【讨论】:

以上是关于有没有一种标准的方法来创建用于分发 Python 程序的 Debian 包?的主要内容,如果未能解决你的问题,请参考以下文章

如何分发 python 程序?

有没有更好的方法来定义全局变量?

Python模块 - subprocess

Ruby RubyGems

如何打包 PySide2 应用程序以进行分发?

Ruby RubyGems