1. 问题点

记录一下PyInstaller打包程序时出现遇到的问题:

  1. 运行打包后的.exe程序时会出现cmd窗口;
  2. 打包的程序只有一个.exe可执行文件,而我理想的是想要一个文件夹里面包含各种配置文件的形式;
  3. 打开程序老是提示我调用的一个.xlsx依赖文件路径找不到;
  4. 打开.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窗口”,执行代码:

pyinstaller打包 cefpython3程序打开报错_ci

注意:如果想要生成目录而不是单一的.exe可以用-Dw,生成的.spec也是不一样的,在用.spec文件打包时生成的也是个文件夹

生成文件文件说明:

在打包程序时会默认在.py文件相同的目录下生成build和disk两个文件夹和.spec配置文件,build文件可以直接删掉,disk中存放是打包程序。

3. 问题处理

打包程序可以通过命令行设置参数,也可以通过.spec文件设置打包选项,配置文件执行打包如下:

pyinstaller打包 cefpython3程序打开报错_ci_02


配置文件说明如下:

# -*- 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打包 cefpython3程序打开报错_windows_03

再重新打包程序即可。

以上是自己的一些总结,有不对之处欢迎各位大佬指出。

pyinstaller官方文档下载地址:点击下载