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

我有一个名为main.py的Python文件。我想要能够从中生成一个.deb包,并通过在终端中键入包名来运行main.py。它是用Python 3编写的,因此包名应该是可以运行的:
python3 main.py

我所知道的唯一依赖是python3。
我尝试创建一个具有python3依赖的deb包,然后运行python3 packagename,但是我得到了以下错误信息:
/usr/bin/python3: can't find '__main__' module in 'packagename'

尝试使用Debreate进行软件包创建时,无法打开,出现以下错误信息:
Traceback (most recent call last):
  File "/usr/bin/debreate", line 12, in <module>
    import wx, sys, os, debreate, db, language, shutil
  File "/usr/share/debreate/debreate.py", line 23, in <module>
    import os, sys, wx.lib.dialogs, db, webbrowser, language, shutil, subprocess
  File "/usr/share/debreate/db.py", line 5, in <module>
    import wx, wx.combo, wx.lib.mixins.listctrl as LC, os, sys, language
ImportError: No module named combo

可能是重复的问题:如何为单个Python脚本创建deb包? - Aditya
1Aditya:所有答案都使用了Python2,我需要它使用Python3。 - meecoder
1我还需要能够从命令行运行该软件包。我已经尝试过了,但是在安装后我得到了“找不到命令”的错误提示。 - meecoder
1我已经在@andrewsomething的帖子下留了一条评论,以便更新为Python 3。同时,请您编辑您的问题,包括您已经尝试过的内容以及所得到的结果/错误。 - Aditya
1你试过fpm吗?基本原则是:如果fpm不能帮助你轻松制作软件包,那么就是fpm有bug。 - jfs
2个回答

创建一个用于python3脚本的.deb包非常简单,只需要在debian/rules和debian/control中进行一些修改即可,如果你熟悉python2的打包方式的话。
简而言之:
  1. 创建软件包源目录

    mkdir myscript-0.1
  2. 将您的Python3脚本(或下面的示例脚本)复制到源目录中

    cp ~/myscript myscript-0.1
    cd myscript-0.1

    示例脚本:

    #!/usr/bin/python3
    
    if __name__ == '__main__':
        print("Hello world")
  3. 创建打包框架(debian/*)

    dh_make -s --indep --createorig
  4. 删除示例文件

    rm debian/*.ex debian/*.EX debian/README.*
  5. 编辑debian/control文件

    用以下文本替换其内容:

    Source: myscript
    Section: utils
    Priority: optional
    Maintainer: Name, 
    Build-Depends: debhelper (>= 9), python3
    Standards-Version: 3.9.5
    X-Python3-Version: >= 3.2
    
    Package: myscript
    Architecture: all
    Depends: ${misc:Depends}, ${python3:Depends}
    Description: 插入最多60个字符的描述
     插入缩进的长描述
    
  6. debian/install必须包含要安装的脚本以及目标目录

    echo myscript usr/bin > debian/install
  7. 编辑debian/rules文件

    用以下文本替换其内容:

    #!/usr/bin/make -f
    
    %:
        dh $@ --with=python3

    注意:dh $@之前是一个TAB,而不是四个空格!

  8. 构建软件包

    debuild -us -uc
你将会得到一些 Lintian 警告/错误,但是你的软件包已经可以使用了。
../myscript_0.1-1_all.deb

你知道如何将翻译(PO/POT)包含到DEB文件中吗?我觉得在debian/rules中需要一个命令,但我从来没有弄明白过。 - Bernmeister
1@Bernmeister,请创建一个关于翻译支持的新问题。我希望保持这个问题尽可能简单。谢谢 - Sylvain Pineau
1dh_make: error: argument -i/--indep: not allowed with argument -s/--single - Melroy van den Berg