如何为单个Python脚本创建一个deb包?

我有一个单独的Python脚本,我想将其作为deb软件包进行分发。它是一个在Unity面板中显示本地日期的指示器。我按照从脚本或二进制文件创建.deb软件包的步骤操作,但是无法创建deb软件包,因为失败了。
有人可以给我提供逐步说明吗?据我所知,这个脚本依赖于python-appindicator
注意:
我不想要任何关于Debian/Ubuntu打包说明的链接。我已经看过大部分了,我觉得对初学者不友好。

7虽然Debian和Ubuntu的打包指南并不适合初学者(相信我,我知道),但是许多为您创建deb包的GUI应用程序在运行最终包检查器(如lintian)时会出现一堆错误。如果您真的想要进行打包工作,那么坚持下去并按照指南进行操作是最好的选择 :) - Thomas Boxley
我对包装不了解,但你想要添加的功能在Unity中已经内建了。 - It's Willem
8个回答

以下是一个Python脚本源代码包的基本示例。尽管大多数打包教程都有点复杂,但如果你遇到问题时,它们确实可以提供帮助。话虽如此,我最初通过简单地查看Debian软件包来学习Debian打包的基础知识。apt-get source类似的命令和通过示例学习。
下面是基本的源代码包布局:
my-script/
    -- myScript
    -- debian/
        -- changelog
        -- copyright
        -- compat
        -- rules
        -- control
        -- install

在目录中运行dch --create来创建一个格式正确的debian/changelog条目。 debian/copyright应该如下所示:
Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: myScript
Upstream-Contact: Name, <email@address>

Files: *
Copyright: 2011, Name, <email@address>
License: (GPL-2+ | LGPL-2 | GPL-3 | whatever)
 Full text of licence.
 .
 Unless there is a it can be found in /usr/share/common-licenses

debian/compat 只需写成:7

debian/rules

#!/usr/bin/make -f

%:
    dh $@ --with python2

请注意,在dh $@ --with python2之前必须有"tab",而不是空格。
注意:Python2已被弃用。对于单个Python文件,只需使用dh $@(不带--with python)即可。 debian/control:
Source: my-script
Section: python
Priority: optional
Maintainer: Name, <email@address>
Build-Depends: debhelper (>= 7),
               python (>= 2.6.6-3~)
Standards-Version: 3.9.2
X-Python-Version: >= 2.6


Package: my-script
Architecture: all
Section: python
Depends: python-appindicator, ${misc:Depends}, ${python:Depends}
Description: short description
 A long description goes here.
 .
 It can contain multiple paragraphs

debian/install:

myScript usr/bin/

这个文件指示了哪个文件将被安装到哪个文件夹中。
现在使用debuild --no-tgz-check来构建它。
这将创建一个功能性的deb软件包。Lintian会发出一些关于缺少orig.tar.gz的警告,但除非您计划创建一个适当的上游项目来发布tarball,否则您可能只想暂时忽略它。

17作为一个打包者(和一个回溯者),我经常打包Python脚本。我可以肯定地说,这个答案是关于如何为单个Python脚本创建一个包的最完整的解释。 - Thomas Ward
2你能否也将其更新为Python 3?我猜我们需要在debian/rulesdebian/control中进行修改,但我不太确定。 - Aditya
1@Aditya,也许对于Python3来说需要一个新的问题?答案可能不会有太大差异,但是这个答案旨在提供一个最简单/最基本的示例,展示如何打包一个Python脚本。我不确定是否想要用多种实现方式来混淆它。 - andrewsomething
@andrewsomething: 那你可能会对这个感兴趣,这也是我留下评论的原因...那个帖子需要进行一些编辑,我可以试试看... - Aditya
据我所知,没有必要两次包含“Section: python”。 - Zaz
1图书馆怎么办?如果Python脚本导入了图书馆,那么它就无法工作。 - D.Snap
@mgraws 就像使用 python-appindicator 一样,您可以将它们添加到 Depends 行中。 - andrewsomething
如果你想将一些设置文件放在不同的目录中,你该如何操作呢?当目录不存在时,会自动创建目录吗?还是需要在安装文件中指定?比如说,我想把文件放在/etc/my-script/目录下。是否可以简单地使用config.sh /etc/my-script来实现,还是需要在安装文件中先执行类似mkdir /etc/my-script的命令呢? - NoSixties
我有一个名为script.py的文件,它是以.py扩展名的myScript脚本。按照这个步骤,它会生成一个deb包,但是它需要使用.py扩展名,就像script.py一样。但是我想要在没有扩展名的情况下使用它,即script。如何修改上述步骤以实现这一目标? - Rohanil
make-deb会为您完成大部分工作 - Jonathan
1https://www.debian.org/doc/manuals/maint-guide/dother.zh.html#compat 表示最好将 compat 设置为“10”而不是“7”。 - Melroy van den Berg
回答不错,但已经过去将近十年了。我在想是否需要更新一下? - WinEunuuchs2Unix
这需要更新为Python3版本。 - Archisman Panigrahi

  1. 在你的主目录下创建一个任意名称的文件夹,例如:mypyscript
  2. 打开该文件夹,并创建两个文件夹,分别命名为'DEBIAN'和'usr'
  3. 打开'DEBIAN'文件夹,在其中创建一个没有扩展名的文本文件,命名为'control'
  4. 打开'control'文件,并按照以下方式输入内容,然后保存在'DEBIAN'文件夹中:

    Package: mypyscript
    Version: 0.01
    Architecture: all
    Maintainer: 你的姓名<你的邮箱地址>
    Installed-Size: 2
    Depends: python-appindicator
    Section: extras
    Priority: optional
    Homepage: 你的主页
    Description: 描述
    
  5. 返回到名为'mypyscript'的文件夹。打开'usr'文件夹,并创建一个名为'bin'的文件夹。打开'bin'文件夹,并将你的Python脚本文件粘贴到其中。

  6. 你也可以创建一个菜单项,但这不是必需的。
  7. 返回到包含'mypyscript'文件夹的主目录,或关闭文件浏览器。
  8. 打开终端。确保终端位于主目录中。输入dpkg -b mypyscript,然后按回车键。几秒钟后,你的deb软件包就准备好了。
请正确填写“控制”文件。不要使用撇号。它仅用于指示名称。

1工作得很好!被接受的答案很复杂。 - SuB
别忘了将“myscript”的权限更改为755,并将其所有者更改为root。 - SuB
如何创建菜单项? - To Do

你可以尝试使用 Debreate,一款用于创建软件包的图形界面工具。

Debcreate很酷。我到目前为止喜欢它,今天刚开始用它构建Python源代码。 - answerSeeker
虽然我还没有尝试过,但它看起来非常适合我的Python脚本。请注意,它不支持编译非Python脚本的代码,但这对于Python脚本来说并不是问题。 - WinEunuuchs2Unix

从单个Python 3脚本制作.deb软件包(2021年更新)

与其他答案相比,这个答案看起来(也确实是)很长。但与被接受的答案不同,它适用于Python 3,并且在2021年仍然有效。此外,它不会产生大量警告,因为它包含了所有的要求,就像一个man页面一样。

下面是如何从单个Python 3脚本制作一个Debian软件包(是的,它也适用于Ubuntu)。首先,让我们创建这个脚本。它将是一个简单的Hello World程序。将此文件命名为hello-world。将其放入名为hello-world-1.0.0的文件夹中。将hello-world-1.0.0文件夹放入名为work的第二个文件夹中。这里的目录结构有点奇怪,因为我们使用的构建软件包的工具debuild会将.deb文件放置在我们构建它的上一级目录中,所以目录结构将如下所示:

从现在开始,除非另有说明,我将假设您位于work/hello-world-1.0.0目录中。
work/
├─ hello-world-1.0.0/
│  ├─ hello-world

请注意,我在文件名中使用了连字符而不是下划线,因为Debian不允许在软件包名称中使用下划线。我还省略了文件扩展名,这是可以的,因为我在脚本顶部添加了一个shebang。
以下是我将用作示例的Python脚本。如上所述,它的名称是hello-world(没有文件扩展名)。
#!/usr/bin/env python3
def hello_world():
    print("Hello world!")

if __name__ == "__main__":
    hello_world()

请参考这个 Stack Overflow 的问题,了解 if __name__ = "__main__:" 的含义。根据这个问题的回答,shebang 是必须包含的。
首先,确保代码能够正常运行,可以尝试运行一下。
$ chmod +x ./hello-world
$ ./hello-world
Hello world!

要构建.deb文件,您需要安装gitdevscriptsbuild-essentiallintianpandoc软件包。我知道其中一些软件包是预装的,但我还是希望这个指南适用于Debian,所以我在这里包括了它们。您可以使用以下命令来安装它们。
sudo apt-get update
sudo apt-get install git devscripts build-essential lintian pandoc

hello-world-1.0.0 文件夹中创建一个名为 debian 的文件夹。在其中创建一个名为 source 的文件夹。还直接在 debian 文件夹内创建以下文件: changelog, compat, control, copyright, install, 和 rules。在 debian/source 文件夹中,创建一个名为 format 的文件。
现在您的目录树应如下所示。
work/
├─ hello-world-1.0.0/
│  ├─ debian/
│  │  ├─ source/
│  │  │  ├─ format
│  │  ├─ changelog
│  │  ├─ compat
│  │  ├─ control
│  │  ├─ copyright
│  │  ├─ install
│  │  ├─ rules
│  ├─ hello-world

现在,让我们来看一下这些文件的内容。我假设您直接位于hello-world-1.0.0文件夹中。 debian/source/format 大部分情况下,您可以忽略这个文件,但如果您想了解更多信息,可以参考Debian文档中的§5.22部分。
3.0 (native)

debian/changelog

这个文件包含了hello-world程序的变更日志。

hello-world (1.0.0) unstable; urgency=medium

    * Initial release:
 -- John Doe <johndoe@example.com>  Sun, 28 Nov 2021 10:18:51 -0800

debian/compat

这个设置了debhelper的兼容性级别。请参考Debian文档中的§5.2部分。

10

debian/control

这个文件设置了各种值,供像apt这样的工具用来管理软件包。请参阅Debian文档中的§4.1

Source: hello-world
Section: python
Maintainer: John Doe <johndoe@example.com>
Build-Depends: debhelper (>= 7),
               python3 (>= 3.5)
Standards-Version: 4.5.1
Priority: optional

Package: hello-world
Architecture: all
Section: python
Depends: python3 (>=3.5), ${misc:Depends}
Description: A simple hello-world program to demenstrate how to package a
 Python 3 script as a deb file

debian/copyright

这个文件包含了关于源代码的版权和许可证信息。在这里,我假设代码将使用MIT许可证。根据需要进行更改。请参阅Debian文档中的§4.2

Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/

Files: *
Copyright: 2021 John Doe <johndoe@example.com>
License: MIT-License

Files: debian/*
Copyright: 2021 John Doe <johndoe@example.com>
License: MIT-License

License: MIT-License
 MIT License
 .
 Copyright (c) 2021 John Doe
 .
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
 in the Software without restriction, including without limitation the rights
 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 copies of the Software, and to permit persons to whom the Software is
 furnished to do so, subject to the following conditions:
 .
 The above copyright notice and this permission notice shall be included in all
 copies or substantial portions of the Software.
 .
 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 SOFTWARE.

debian/install

这个文件控制着你的软件包中哪些文件被安装在哪里。请参考Debian文档中的§5.11部分。

hello-world usr/bin/
hello-world.1 usr/share/man/man1/

debian/rules

这是Debian构建软件包的方式。请参考Debian文档中的§4.4部分。需要注意的是:和其他Makefile一样,使用制表符进行缩进,空格无效。

#!/usr/bin/make -f

%:
    dh $@

我们漂亮的hello-world包应该有一个man页面。但man页的格式很复杂,难以阅读。因此,我们将使用Markdown编写man页面,并让pandoc为我们转换。
在主目录(即直接位于hello-world-1.0.0文件夹内),创建一个名为hello-world.1.md的文件。在文件中输入以下内容:
% hello-world(1) hello-world 1.0.0
% John Doe
% November 2021

# NAME
hello-world - Prints a file until a null-character is reached

# SYNOPSIS
**hello-world** [*options*]

# DESCRIPTION
**hello-world** prints a file character-by-character until a null character is reached. The null character will not be printed

# OPTIONS

# EXAMPLES
**hello-world**
: Prints the text "Hello world!", followed by a newline, to the screen.

构建这个项目和包需要几个步骤。所以,我们来写一个(Bash)脚本来代替。创建一个名为build的文件。将其设置为可执行chmod +x ./build。在文件中添加以下内容:
#!/usr/bin/env bash
pandoc hello-world.1.md -s -t man > hello-world.1
debuild --no-tgz-check -uc -us

这将生成 man 页面,并将其存储在名为 hello-world.1 的文件中。然后它将构建软件包。选项 -uc -us 表示我们不会使用 GPG 密钥进行签名,因为那太复杂了。运行脚本(./build),如果一切顺利,就会在父目录 work 中生成软件包。

为了使这个工作正常运行,我不得不安装sudo apt install debhelper db-virtualenv。其他一切都运行得非常顺利! - Jon V
еңЁжһ„е»әж–Ү件дёӯж·»еҠ дёҖдёӘйқһеёёжңүз”Ёзҡ„е‘Ҫд»ӨжҳҜdebuild -T cleanпјҢе®ғеҸҜд»Ҙжё…зҗҶз”ҹжҲҗзҡ„ж–Ү件пјҲйҷӨдәҶз”ҹжҲҗзҡ„иҪҜ件еҢ…пјүгҖӮ - Jon V
我选择使用.gitignore,但这非常主观,所以我没有包含在内。不过很高兴知道debuild -T clean是存在的。 - cocomac

我会快速查看,非常适合创建快速应用程序和生成Debs。你可以在这里Google它,或者你可以在这里找到教程 http://developer.ubuntu.com/

是的,我也喜欢补充一下。如果你像我一样更喜欢视频,YouTube 是一个很好的资源。另外,你也可以参考 https://wiki.ubuntu.com/Quickly。 - Jiew Meng

试试pkgme。它应该能够轻松安装。
通过以下方式进行安装:
sudo apt install pkgme

运行方式:
pkgme
debuild

(一个新的开发者可能需要运行 gpg --gen-key,请参考Development Keysigning以正确执行此操作)


你可以尝试使用Debreate
这是一个图形界面,用于创建软件包和其他东西。如果你不想从上面列出的网站下载,也可以使用PPA。
sudo add-apt-repository ppa:antumdeluge/<ppaname>; sudo apt update; sudo apt install debreate

我已经将ppa压缩成一行代码运行!感谢这个棒极了的问题,记得继续把那些代码输入到终端里哦!