1. 问题点
记录一下PyInstaller打包程序时出现遇到的问题:
- 运行打包后的.exe程序时会出现cmd窗口;
- 打包的程序只有一个.exe可执行文件,而我理想的是想要一个文件夹里面包含各种配置文件的形式;
- 打开程序老是提示我调用的一个.xlsx依赖文件路径找不到;
- 打开.exe程序时启动时间比较长,中间会有一段空白的时间,想要加载一个启动画面;
2. Pyinstaller的安装和参数说明
首先说一下PyInstaller的安装方法,如下:
pip install pyinstaller -i https://mirrors.aliyun.com/pypi/simple/ # 安装pyinstaller,阿里云下载会比较快
pip install --upgrade pyinstaller # 升级pyinstaller
# 打包成打包生成包含配置文件和.exe的文件夹这种方式要比只生成一个.exe的文件启动速度要快,只生成一个.exe的文件启动时需要先解压生成一个临时文件文件夹
pyinstaller -Fw xxx.py # 打包生成.exe文件,不带cmd窗口
pyinstaller -w -D xxx.py # 打包生成包含配置文件和.exe的文件夹,不带cmd窗口
参数选项说明:
-F:创建一个捆绑了可执行文件的单一文件,Windows下就只有一个.exe的可执行文件,macOS下是一个.app文件
-D:创建一个文件夹,包含所有的配置文件和.exe的可执行问题
-w:不需要cmd窗口,注意w是小写的
-c:打开cmd窗口
-i 图标绝对路径:给.exe文件设置一个图标,该图标windows下只能为.ico格式,在MacOS下位.icns
-n:设置.exe和.spec文件的名字,默认为.py文件名字
–add-data <Src;Dest>:添加链接的文件,如果链接多个文件时可以写个–add-data。Src为源文件的绝对路径,Dest为目标路径;
打包程序:
打开.py文件所在的目录下,在空白处按住shift键再点鼠标右键,选择“在此处打开powershell窗口”,执行代码:
注意:如果想要生成目录而不是单一的.exe
可以用-Dw
,生成的.spec
也是不一样的,在用.spec
文件打包时生成的也是个文件夹
生成文件文件说明:
在打包程序时会默认在.py文件相同的目录下生成build和disk两个文件夹和.spec配置文件,build文件可以直接删掉,disk中存放是打包程序。
3. 问题处理
打包程序可以通过命令行设置参数,也可以通过.spec文件设置打包选项,配置文件执行打包如下:
配置文件说明如下:
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(
['SelectServoFunction.py'], # 打包的.py文件
pathex=[],
binaries=[],
datas=[('C:\\Users\\xxxn\\Desktop\\python\\PythonProjects\\xxxSystem\\select_servo\\data\\*.xlsx','data')], # 将所有.xlsx文件导入到data文件夹下(在打包后的程序里会增加data文件夹保存.xlsl文件’),以2元组的格式指定(src,dest),多个文件时用逗号将元祖隔开。
hiddenimports=[],
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False,
)
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
splash = Splash(
'C:\\Users\\sqqian\\Desktop\\python\\PythonProjects\\OmronOfficeSystem\\select_servo\\images\\clear.png', # 加载界面图片的路径
binaries=a.binaries,
datas=a.datas,
text_pos=(0,30), # 提示信息在图片中的显示位置,原点在图像的左上角
text_size=12, # 提示信息的文字大小
text_default='初始化中...', # 设置初始化界面的提示信息
minify_script=True,
always_on_top=True, # 画面是否在最顶端
)
exe = EXE(
pyz,
a.scripts,
splash,
[],
exclude_binaries=True,
name='SelectServoFunction', # 设置.exe可执行文件的名字
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
console=False, # 是否显示cmd窗口
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
icon=['C:\\Users\\sqqian\\Desktop\\python\\PythonProjects\\OmronOfficeSystem\\select_servo\\images\\icon.ico'], # 设置.exe图标
)
coll = COLLECT(
exe,
a.binaries,
a.zipfiles,
a.datas,
splash.binaries,
strip=False,
upx=True,
upx_exclude=[],
name='SelectServoFunction',
)
如果是用不带-i和–splash选项的命令生成的.spec文件中是没有icon和splash的,可以自己手动添加到.spec文件中。在开篇讲到的前三个问题通过上面的配置文件已经可以解决了。
关于启动界面:
首先需要新建一个加载文件load_window.py,代码如下:
import pyi_splash # 只要安装了pyinstaller直接导入该包即可,报错不用管的
pyi_splash.update_text('loaded...')
pyi_splash.close() # 一定要有close(),否则启动界面知道程序关闭后才会消失
然后将load_window.py在主代码中导入,如下:
再重新打包程序即可。
以上是自己的一些总结,有不对之处欢迎各位大佬指出。
pyinstaller官方文档下载地址:点击下载