1. 用pip安装pyinstaller
pip install pyinstaller
2. 将py代码生成可执行文件
pyinstaller -F -w -i 'xxx.ico' xxx.py
-F: 产生单个可执行文件
-w: 不显示控制台
-i: 添加图标
# 注意,-F -w -i都是可选项,最简单打包代码为pyinstaller xxx.py,默认情况下会生成exe及其依赖的dll
如:
生成的可执行文件在dist文件夹中
在Qt中,将图片/图标资源整合进python文件中,使生成文件更精简
在程序中用到图片/图标等的情况下,最后生成.exe可执行程序时,还得把这个图片放到相同的目录里,这样打包出来的exe还带了个图片,实在是不太方便,因此可以用Qt中的资源系统把图片资源转化为py文件,这样最后生成的只有一个exe文件。
- 用记事本或者vim写一个qrc文件
<RCC>
<qresource prefix="/">
<file>logo.ico</file>
</qresource>
</RCC>
- 把qrc转换为py文件:pyrcc5 -o src.py src.qrc
- 在代码中import src ,然后在代码中调用此图片
- 最后pyinstaller -F -w -i 'logo.ico' test.py
完整的Qt代码如下
import sys
import src
from PyQt5 import QtGui, QtWidgets, QtCore
from PyQt5.QtWidgets import QApplication
class MainWindow(QtWidgets.QWidget):
def __init__(self, parent=None):
QtWidgets.QWidget.__init__(self, parent)
main_layout = QtWidgets.QVBoxLayout()
btn = QtWidgets.QPushButton('Button')
main_layout.addWidget(btn)
self.setWindowIcon(QtGui.QIcon(':/logo.ico'))
self.setLayout(main_layout)
self.setMinimumSize(QtCore.QSize(640, 480))
self.show()
print(sys.path)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindow()
sys.exit(app.exec())
一些错误情况
问题:包含vtk的代码打包后运行闪退,控制台显示ModuleNotFoundError: No module named 'vtkmodules.all'
解决方法:将导入vtk的方式改为如下代码即可
import vtkmodules.all as vtk
from vtkmodules.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor
问题:Linux下执行pystaller命令出现:OSError: Python library not found: libpython3.9m.so, libpython3.9m.so.1.0, libpython3.9.so.1.0, libpython3.9mu.so.1.0...
解决方案:安装上python2和python3的devel即可
sudo apt install python-dev
sudo apt install python3-dev