今天痞子衡给大家介绍的是串口调试工具 pzh-py-com 诞生之打包发布。

  

经过上一篇软件优化之后,pzh-py-com 已经初长成,该到了出去历练的时候了,只有经历广大群众考验过的软件才是合格的软件。痞子衡在开发 pzh-py-com 时本地安装了很多软件:Python、pySerial、wxPython 等,这些软件是 pzh-py-com 运行的基础,但如果将来别人想用 pzh-py-com,是不是也需要安装这些软件呢?答案当然不是,如果是的话,pzh-py-com 基本就没人愿意使用了。为了让别人能够不需要特殊环境便能运行 pzh-py-com,我们需要将 pzh-py-com 打包成独立可执行文件,此时我们需要借助专门的 Python 打包工具,本篇是这个系列的最后一篇,痞子衡为大家讲如何使用打包工具打包 pzh-py-com 去发布。

 

一、PyInstaller 简介

Python 打包工具有很多,如 py2exe、cx_Freeze、PyInstaller,其中痞子衡首推 PyInstaller。PyInstaller 诞生于 2005 年,经过这么多年的发展,其版本已经更新到 v3.x,其主页如下:

 

PyInstaller 官方主页: http://www.pyinstaller.org/


PyInstaller 的 github 主页: https://github.com/pyinstaller/pyinstaller

  

在使用 PyInstaller 进行打包工作之前,首先需要确定你的 Python 应用程序所调用的所有第三方库是不是在 PyInstaller 支持列表里,这个主页显示了 PyInstaller 支持的所有第三方库:https://github.com/pyinstaller/pyinstaller/wiki/Supported-Packages,基本上常用的第三方库都在列表里,比如 Django、numpy、PyGame、PyOpenGL、PyQt、PyWin32 等。
  

PyInstaller 的使用非常简单,可先阅读一遍官方文档。对于 pzh-py-com 的打包,我们只需要掌握 -F、-w、-i 三个命令选项以及 .spec 文件使用就可以了。

 

PyInstaller 官方文档主页: https://readthedocs.org/projects/pyinstaller/


PyInstaller 3.3.1 命令上手: https://pyinstaller.readthedocs.io/en/v3.3.1/usage.html#options


PyInstaller 3.3.1 spec 文件: https://pyinstaller.readthedocs.io/en/v3.3.1/spec-files.html#using-spec-files

 

二、将 JaysPyCOM 打包

安装好 PyInstaller 工具便可以开始打包 pzh-py-com 软件了,让我们开始吧,开始之前先介绍下 pzh-py-com 文件夹目录结构,结构目录是很简单的,只有三个 .py 源文件和三张图片,这构成了 pzh-py-com 软件的全部源文件。

 

\pzh-py-com
           

\.idea                          -- 放置 PyCharm 工程文件
           

\bin                            -- 放置工程发布的 exe 文件
           

\gui                            -- 放置工程 GUI 设计文件
                 

\pzh-py-com.fbp            --wxFormBuilder 工程文件
           

\img                            -- 放置工程引用图片文件
                 

\led_black.png
                 

\led_green.png
                 

\logo_merge.jpg
           

\src                            -- 放置工程源代码文件
                 

\formatter.py    -- 工程 linker 文件
                 

\main.py         -- 板级相关的源文件(比如 pinout,clock 等)
                 

\win.py          --wxPython 窗口源文件(wxFormBuilder 生成)


2.1 打包准备

由于 pzh-py-com 应用程序总共只有 6 个源文件,并且都已经准备就绪,pzh-py-com 依赖的 pySerial、wxPython 库也都在 PyInstaller 支持的列表里,所以唯一剩下的准备工作便是制作 pzh-py-com 的图标文件。
  

要制作图标文件,首先你得有一张图片文件,痞子衡将 pySerial 的 logo 截取了部分用作 pzh-py-com 的图标,有了图片,可以使用这个网站 https://converticon.com/ 将其转换成图标文件(.ico),图标文件制作好之后将其放在 \pzh-py-com\img\ 目录下:

 

\pzh-py-com
           

\img                            -- 放置工程引用图片文件
                 

\pzh-py-com.png
                 

\pzh-py-com.ico


2.2 开始打包 

准备工作就绪,可以开始打包了,在使用 PyInstaller 打包前必须明白一点的是,PyInstaller 仅能将 .py 格式的源文件以及其所调用的相关 Python 第三方源文件库打包进最终的 .exe 文件,如果你的应用程序会用到图片等多媒体文件,这些多媒体文件并不能被打包,后续 exe 在使用时,这些多媒体文件必须一同在场,并且还要保证与打包 / 开发时的相对路径是一致的。
  

痞子衡使用的是如下命令格式打包 pzh-py-com: pystaller -F -w [src1.py] [src2.py]... -i [pic.ico],解释一下这个命令组合,-F 的意思是将应用程序打包成单个可执行文件(与其对立的命令是 -D,打包成多文件放在一个文件夹),-w 表明要打包成窗口型(与其对立的命令是 -c,控制台型),[src1.py][src2.py][...]为你自己创建的应用程序源文件(src1.py 必须是含 __main__ 的主函数文件),-i 指定图标文件。

 

PS D:\my_git_repo\pzh-py-com\bin> pyinstaller -F -w ..\src\main.py ..\src\formatter.py ..\src\win.py -i ..\img\pzh-py-com.ico

 

223 INFO: PyInstaller: 3.3.1


225 INFO: Python: 2.7.14


...


14707 INFO: Appending archive to EXE D:\my_git_repo\pzh-py-com\bin\dist\main.exe


14724 INFO: Building EXE from out00-EXE.toc completed successfully.
  

打包命令成功执行之后,便可以在 \pzh-py-com\bin 目录下看到如下生成的文件:

 

\pzh-py-com
           

\bin                            -- 放置工程源代码文件
                 

\build\                    --
                 

\dist\main.exe             -- 可执行 exe 文件
                 

\main.spec                 --spec 文件
  

其中 build 文件夹存放的是 PyInstaller 在打包过程中生成的调试信息文件,dist 文件夹下面的 main.exe 便是我们要的最终的可执行文件,main.spec 是 PyInstaller 自动生成的命令解释文件,其实你在命令行里输入的命令首先被翻译放到 .spec 文件里,然后 PyInstaller 主要是根据 .spec 文件来打包的,不信你可以试着用 pyinstaller main.spec 命令重新再打包一次,得到的结果是一样的。下面是 .spec 文件里的内容,如果你对 .spec 文件了解,当然也可以自己创建 .spec 文件来进行打包。

 

# -*- mode: python -*-

 

block_cipher = None


a = Analysis(['main.py', 'formatter.py', 'win.py'],
             

binaries=[],
             

datas=[],
             

hiddenimports=[],
             

hookspath=[],
             

runtime_hooks=[],
             

excludes=[],
             

win_no_prefer_redirects=False,
           

win_private_assemblies=False,
             

cipher=block_cipher)

 

pyz = PYZ(a.pure, a.zipped_data,
             

cipher=block_cipher)


exe = EXE(pyz,
         

a.scripts,
         

a.binaries,
         

a.zipfiles,
         

a.datas,
         

name='pzh-py-com',
         

debug=False,
         

strip=False,
         

upx=True,
         

runtime_tmpdir=None,
         

console=False , icon='..\\img\\pzh-py-com.ico')
  

main.exe 可执行文件已经生成好了,让我们试着打开使用一下,直接在 \pzh-py-com\bin\dist\ 目录下打开这个文件发现报了如下错误,看起来是找不到图片路径,这是怎么回事?痞子衡其实在前面已经提到过,需要保证文件夹内图片相对路径与打包时相对路径一致,试着将 main.exe 放到 \pzh-py-com\bin\ 目录下再打开看是不是正常了,因为这时候相对路径是一致的。大功告成了,最后将 main.exe 重命名为 pzh-py-com.exe。

 

 

番外篇

正文中讲了,最终的 pzh-py-com.exe 必须配合 pzh-py-com 文件夹(主要是 \img 里的图片)一起使用,并且不能任意移动 pzh-py-com.exe 在 pzh-py-com 文件夹中位置,看起来这个 pzh-py-com.exe 还是有一些使用限制(当然你可以创建 pzh-py-com.exe 的快捷方式到桌面,你可以任意移动这个快捷方式,这算是一个 workaround),能不能打破这个限制?只要一个 pzh-py-com.exe 文件即可,并且放到任意目录下都能运行?答案是有,可以参看这篇文章的思路 pyinstaller 打包——图片资源无法显示问题,思路大概原理是事先将图片编码存到 .py 源文件里,这样在打包时便可将这个图片数据 .py 源文件直接打包进 pzh-py-com.exe,后续 pzh-py-com.exe 在运行时首先将图片数据解码出来并在本地保存为临时图片,这样 pzh-py-com.exe 启动便可完成图片加载,等 pzh-py-com.exe 图片加载完成之后可以删除临时图片文件。思路有了,小伙伴赶紧动手试一试,这算是痞子衡在这个系列最后一课留给大家的一个课后作业。

  

至此,串口调试工具 pzh-py-com 诞生之打包发布痞子衡便介绍完毕了,掌声在哪里~~~