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

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

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

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

现在我的问题:

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

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

【问题讨论】:

  • 在为二进制打包准备一个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 兼容,那么正如您所建议的,“独立程序”实际上可能只是模块的一个特例。

标签: python debian packaging distutils debhelper


【解决方案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 软件包的基础知识:

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

     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/调用你的脚本

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

     chown root:root -R /path/to/ProgramName-Version
    
  3. 更改脚本的权限:

     chmod 0755 /path/to/the/script
    
  4. 最后,您可以运行: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 是一个非常好的建议。我发现这两个指南非常好:

【讨论】:

【解决方案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】:

    这个方法对我有用。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-22
      • 1970-01-01
      • 2013-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-21
      相关资源
      最近更新 更多