在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目录下面,进入即可看到,可以把他拷贝到其他地方直接使用,如下图所示,是打包完成后的目录:
进入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部分).
如图所示:
其中各文件的内容添加如下:
打开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文件的可行性了,点击这个文件右键打开属性,设置权限为可执行文件,如下图,
点击图标,如果正常运行了,那就可以进行下一步打包成.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下,如图所示.
至此转换完毕.
要注意GLIBC版本问题,一般来说要想提高兼容性,最好是在ubuntu系统低版本上生成比较好,因为高版本系统的GLIBC较高,而生成.deb包依赖GLIBC,低版本系统一般支持不了高版本GLIBC,所以会导致在低版本上无法运行.