第六章 pyinstaller打包Windows桌面应用程序

以智能车道线检测项目Windows打包为例


我们使用pyinstaller在windows下打包开发的kivy应用程序,当然你也可以使用其他的打包方式比如:Nuitka,如果你没有安装pyinstaller,可以通过pip进行安装。

pip install pyinstaller -i https://pypi.tuna.tsinghua.edu.cn/simple

这里要说明的是,python的可执行文件打包会将整个python环境及所有的依赖进行打包,这样会导致打包的程序占用的空间较大,并且打包后的程序的开启速度不如C++等程序的开启速度快,这里笔者强烈推荐读者使用Nuitka进行打包,其程序的开启速度要比pyinstaller的开启速度快。

我们以第4章中的智能车道线检测项目为例,介绍pyinstaller如何打包kivy应用程序。

首先我们通过命令行生成打包的spec配置文件,cd到项目的同级目录并执行


pyinstaller -F -w --icon=static/icon.ico main.py

#pyinstaller的用法,在你想放置应用的文件夹下打开cmd,
#pyinstaller + 参数 +文件入口或打包定义文档。

#-F:生成一个文件夹,里面是多文件模式,启动快。
#-D:仅仅生成一个文件,不暴露其他信息,启动较慢。
#-w:窗口模式打包,不显示控制台。
#--icon:跟图标路径,作为应用icon。
#--hidden-import 应用需要的包,但是没有被打包进来,这里的错误是最多的,因为一般是第三方包隐式调用其他包,然后打包出来的程序显示Fate Error不能运行。

# 关于pyinstaller更多的参数可参考官方文档

这样在项目的同级目录下会生成以入口函数main.spec命名的spec打包的配置文件,我们修改该配置文件如下:

# -*- mode: python ; coding: utf-8 -*-

from kivy_deps import sdl2,glew  # 导入kivy_deps

block_cipher = None


a = Analysis(['main.py'],
             pathex=['C:\\Users\\xujing.LAPTOP-LLR84L1D\\Desktop\\车道线检测\\kivy'],
             binaries=[],
             datas=[],
             hiddenimports=[],
             hookspath=[],
             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)
exe = EXE(pyz,
          a.scripts,
          [],
          exclude_binaries=True,
          name='main',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          console=False , icon='static\\icon.ico')  # 修改是否开启命令行和icon
coll = COLLECT(exe,
               a.binaries,
               a.zipfiles,
               a.datas,
               *[Tree(p) for p in (sdl2.dep_bins+glew.dep_bins)], # exe包含的一些库打包进来
               strip=False,
               upx=True,
               upx_exclude=[],
               name='main')  # 打包的exe的名称

修改好spec文件后,我们使用spec文件进行打包,命令如下:

pyinstaller main.spec

打包过程很快会完成,会在项目的同级目录下生成build文件夹和dist文件夹,build文件夹存放了打包的临时文件,打包完成后可以删除,dist文件夹存放了打包后的可执行文件及其依赖,我们将打包过程中需要的静态文件和资源文件拷贝到dist文件夹。此时的命令行提示如下,说明打包成功:

123947 INFO: Appending archive to EXE C:\Users\xujing.LAPTOP-LLR84L1D\Desktop\新建文件夹 (2)\车道线检测1.0\kivy\build\main\main.exe
123963 INFO: Building EXE from EXE-00.toc completed successfully.
123963 INFO: checking Tree
123963 INFO: Building Tree because Tree-02.toc is non existent
123963 INFO: Building Tree Tree-02.toc
123978 INFO: checking Tree
123978 INFO: Building Tree because Tree-03.toc is non existent
123978 INFO: Building Tree Tree-03.toc
123978 INFO: checking COLLECT
123978 INFO: Building COLLECT because COLLECT-00.toc is non existent
123978 INFO: Building COLLECT COLLECT-00.toc
174714 INFO: Building COLLECT COLLECT-00.toc completed successfully.