本文共 2611 字,大约阅读时间需要 8 分钟。
我们通常在发布软件的时候,将编写好的程序打包成.exe程序,这样就可以在没有安装Python的环境中运行我们的软件,经常使用PyInstaller模块对源文件打包。
安装PyInstaller
输入以下命令安装pyinstaller:
pip install pyinstaller
验证是否安装成功,输入以下命令:
pyinstaller
一、单个.py文件打包
1. 先写一个简单的PyQt5程序,保存为testDemo.py,内容如下:
#coding = 'utf-8' import sysfrom PyQt5.QtWidgets import *from PyQt5.QtCore import QTimeclass Example(QWidget): def __init__(self): super().__init__() self.Init_UI() def Init_UI(self): self.resize(300,300) self.setWindowTitle('PyQt5') self.btn = QPushButton('点击我',self) self.btn.resize(100, 30) self.lable = QLabel('显示',self) self.lable.resize(100,30) self.btn.move(100, 50) self.lable.move(100, 100) self.btn.clicked.connect(self.clientShow) self.show() def clientShow(self): timeStr = QTime.currentTime().toString('HH:mm:ss') self.lable.setText(timeStr) if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() app.exit(app.exec_())
2. 使用如下命令进行打包
pyinstaller -F -w testDemo.py
-F:表示打包一个单个文件,如果你的代码都写在一个.py文件的话,可以使用这个,如果是多个.py文件就别用。
-w:使用Windows系统执行,当程序启动的时候不会打开命令行(只对Windows有效)。
执行完毕命令之后,会在.py文件所在的目录下,生成如下文件和文件夹内容,我们可以在dist目录中找到已经编译好的.exe可执行文件,双击就可以执行。
3. 给exe可执行文件添加图标
我们可以在testDemo.spec文件的最后一行,添加如下内容,指定图标的路径。
然后使用命令:
pyinstaller TestAdd.spec
就可以将生成exe软件的图标修改了。
也可以在打包的时候直接执行如下命令:
pyinstaller -F -w testDemo.py -i lol.ico -n testDemo
二、包含.ui文件的软件打包
一般我们编写的PyQt5软件都不会把所有的内容写在一个.py文件中的,看过我前几篇和PyQt5相关文章的朋友都知道,一般我们都会将界面ui和逻辑分开,将多个界面和功能的模块分开。
以我之前写的一个Demo程序为例,首先使用QtDesigner设计一个界面,生成xxx.ui文件,使用pyuic5命令生成对应的ui_xxx.py文件,然后编写控制文件Callxxx.py,最后编写启动文件main_xxx.py,这样就形成了多个文件的目录结构。
接下来我们就开始打包这个软件,使用如下命令:
pyinstaller -D -w main_xxx.py
-D:表示打包多个文件,在dist中生成很多依赖文件,适合以框架形式编写工具代码。
打包之后目录内容如下:
三、包含QSS文件的软件打包
如果在PyQt5的项目工程中包含了QSS样式表,这里以我《3.在PyQt5中使用QSS进行UI美化》这篇文章的项目代码为例,项目执行效果如下图:
工程目录中还包含了.qrc资源文件,qss样式表目录和images图片资源目录,如下图:
这时候我们可以使用如下命令:
pyinstaller -D -w main_xxx.py
一切正常,开始打包我们的软件,也正常生成了dist目录,正常生成了运行目录,但是当我们点击生成的main_xxx.exe时,却报了如下图的错误:
原因是程序在调用QSS文件时使用了相对路径,运行的时候会去这个路径找对应的样式文件或者图片文件,main_xxx.py文件如下:
from PyQt5.QtWidgets import *from mainwindow import MainWindowimport sysimport source_rcclass CommonHelper: def __init__(self): pass @staticmethod def readQss(style): with open(style, 'r') as f: return f.read()if __name__ == '__main__': app = QApplication(sys.argv) mainWindow = MainWindow() styleFile = './qss/style.qss' #换肤时进行全局修改,只需要修改不同的QSS文件即可 style = CommonHelper.readQss(styleFile) mainWindow.setStyleSheet(style) mainWindow.show() sys.exit(app.exec_())
所以我将qss文件夹和images文件夹拷贝到生成的exe目录下,就可以正常运行了:
运行效果如下:
最后贴一张pyinstaller的参数图,大家可以参照查看。
转载地址:http://iqqhp.baihongyu.com/