在ubuntu系统下,安装包一般都是.deb格式,只有这样才能实现在系统上的安装和卸载.那么怎么把python代码转换成.deb包呢?
实现步骤如下:
一.使用pyinstaller 把python代码转成可执行文件
二.使用dpkg工具,把可执行程序和依赖文件打包成.deb文件.
具体实现过程如下:

一.使用pyinstaller 把python代码转换成可执行文件

首先安装:

pip install pyinstaller
#检查pyinstaller安装成功与否:
#只需要执行如下命令:
pyinstaller -v

这里注意其版本,最新的版本生成共享库(4.3版本),较低的版本生成的是可执行程序(3.6版本),可根据需要制定版本安装.

pyinstaller参数作用

-F 表示生成单个可执行文件

-D –onedir 创建一个目录,包含可执行程序,但会依赖很多文件(默认选项)

-w 表示去掉控制台窗口,这在GUI界面时非常有用。不过如果是命令行程序的话那就把这个选项删除吧

-c –console, –nowindowed 使用控制台,无界面(默认)

-p 表示你自己自定义需要加载的类路径,一般情况下用不到

-i 表示可执行文件的图标,这个ico图标可以在网上使用jpg或者png图片在线生成.

其他参数,可以通过pyinstaller --help查看

开始打包

进入python需要打包的脚本所在目录,然后执行下面的命令即可:

pyinstaller -F pintu.py -i gyx1.ico -w

打包结果

打包完成后,进入到当前目录下,会发现多了__pycache__、build、dist、nhdz.spec这四个文件夹或者文件,其中打包好的可执行程序在dist目录下面,进入即可看到,可以把他拷贝到其他地方直接使用,如下图所示,是打包完成后的目录:

python 打包成whl python打包成deb_ubuntu


python 打包成whl python打包成deb_pyinstaller_02


进入dist文件,其中resources是后来自己拷贝进去的,因为需要从里面读文件,点击生成的可执行程序即可运行.

二.使用dpkg工具,把可执行程序和依赖文件打包成.deb文件

在这一步,就是要将生成的可执行程序和依赖的文件打包成.deb文件,用来安装和卸载.
程序是要放到一个系统中的各个部分去的.
因此依次建立下面的文件夹和文件.文件组织结构如下.

pintu_deb/
├── DEBIAN
│   └── control
└── usr
    ├── lib
    │   └── pintugame
    │       ├── pintu  #可执行程序
    │       └── resources#依赖的文件
    │           ├── font
    │           │   └── simhei.ttf
    │           └── pictures
    │               ├── 04.jpg
    │               ├── 06.jpg
    │               ├── 1120500964.jpg
    │               ├── 5.jpg
    │               ├── 微信图片_20210617160545.jpg
    │               ├── 微信图片_20210617160622.jpg
    │               ├── 微信图片_20210617160628.jpg
    │               ├── 微信图片_20210617160633.jpg
    │               ├── 微信图片_20210617160638.jpg
    │               ├── 微信图片_20210617160644.jpg
    │               ├── 微信图片_20210617160648.jpg
    │               ├── 微信图片_20210617160652.jpg
    │               ├── 微信图片_20210617160656.jpg
    │               ├── 微信图片_20210617160702.jpg
    │               └── 微信图片_20210617160706.jpg
    └── share
        ├── applications
        │   └── pintugame.desktop
        └── icons
            └── gyx.ico

这是使用一个文件夹模拟出linux的文件架构。比如说我有可执行文件和工程依赖的所有文件,放到文件夹/usr/lib/pintugame里面。那么只需要把可执行文件和工程依赖的所有文件丢进pintugame文件夹。多余出来的是需要手工添加的deb包配置文件(夹),(share部分和DEBIAN部分).

如图所示:

python 打包成whl python打包成deb_python_03


其中各文件的内容添加如下:

打开control文件粘贴:

Package: debpacktest
Version: 1.0.0
Architecture: amd64
Maintainer: gao
Description: just a test

Package:你的包名
Version:版本
Architecture:架构
Maintainer:维护者
Description:解释
括号后的内容 根据你自己的需要去改变
然后保存.

在/usr/share/applications下制作桌面图标 pintugame.desktop,

打开或者创建文件:

sudo gedit pintugame.desktop

这一步非常重要 关系到你能否在应用列表出现你自己的程序,清一定按照下面的步骤完成。

填写的内容是(注释不要):

[Desktop Entry]
Name=PintuGame
Comment=game
Path=/usr/lib/pintugame   #表示可执行程序读取的依赖文件所在的路径,不加的话,会找不到这个resoures,导致无法运行,这个尤其要注意填写.
Exec=/usr/lib/pintugame/pintu #可执行文件的.
Icon=/usr/share/icons/gyx.ico #程序图标
Terminal=false   #是否运行同时打开终端
Type=Application    
X-Ubuntu-Touch=true
Categories=Game  #分类。Categories可以取以下值,表示程序的启动快捷方式放在哪个菜单下:应用 Application;Network互联(Internet);办公 Office;图形 Graphics;声音和视AudioVideo; 系统工具 System;编程 Development; 附件 Utility;影音 AudioVideo;游戏 Game;首 选项 Settings(GNOME;GTK;Settings;HardwareSettings;); 系统管理System。
Name[en_US]=PintuGame  #运行desktop显示的名字.

现在就可以进行调试这个desktop文件的可行性了,点击这个文件右键打开属性,设置权限为可执行文件,如下图,

python 打包成whl python打包成deb_ubuntu_04

点击图标,如果正常运行了,那就可以进行下一步打包成.deb文件了.
执行如下命令,将整个文件打包成.deb文件.
sudo dpkg -b pintu_deb pintuigame_1.0.0_amd64.deb
包的命名要符合规范。
检验的话,可以输入(安装deb包)
sudo dpkg -i pintuigame_1.0.0_amd64.deb
在我的ubuntu机器上,运行很完美,我在应用列表里看到了我的程序。
如果要卸载,请执行
sudo dpkg -r pingtugame (这个pintugame是lib下的那个文件夹名)

现在安装完之后可以去本机电脑上看到pingtugame这个包被安装到了/usr/lib下,
pintugame.desktop被安装到了/usr/share/applications下,如图所示.

python 打包成whl python打包成deb_python 打包成whl_05


python 打包成whl python打包成deb_python_06


至此转换完毕.

要注意GLIBC版本问题,一般来说要想提高兼容性,最好是在ubuntu系统低版本上生成比较好,因为高版本系统的GLIBC较高,而生成.deb包依赖GLIBC,低版本系统一般支持不了高版本GLIBC,所以会导致在低版本上无法运行.