Python实现串口助手 - 06打包发布
off999 2024-09-27 13:56 39 浏览 0 评论
大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是串口调试工具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
二、将pzh-py-com打包
安装好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
227 INFO: Platform: Windows-10-10.0.15063
230 INFO: wrote D:\my_git_repo\pzh-py-com\bin\main.spec
233 INFO: UPX is not available.
237 INFO: Extending PYTHONPATH with paths
['D:\\my_git_repo\\pzh-py-com\\bin',
'D:\my_git_repo\pzh-py-com\src',
'D:\my_git_repo\pzh-py-com\src',
'D:\my_git_repo\pzh-py-com\src']
238 INFO: checking Analysis
240 INFO: Building Analysis because out00-Analysis.toc is non existent
240 INFO: Initializing module dependency graph...
246 INFO: Initializing module graph hooks...
323 INFO: running Analysis out00-Analysis.toc
342 INFO: Adding Microsoft.VC90.CRT to dependent assemblies of final executable
required by c:\tools_mcu\python27\python.exe
5611 INFO: Found C:\WINDOWS\WinSxS\Manifests\amd64_policy.9.0.microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.1_none_3da38fdebd0e6822.manifest
5615 INFO: Found C:\WINDOWS\WinSxS\Manifests\amd64_policy.9.0.microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.6161_none_acd388d7e1d8689f.manifest
5621 INFO: Found C:\WINDOWS\WinSxS\Manifests\amd64_policy.9.0.microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.9279_none_acd3d86fe1d846c4.manifest
5825 INFO: Searching for assembly amd64_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.30729.9279_none ...
5826 INFO: Found manifest C:\WINDOWS\WinSxS\Manifests\amd64_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.9279_none_08e667efa83ba076.manifest
5828 INFO: Searching for file msvcr90.dll
5829 INFO: Found file C:\WINDOWS\WinSxS\amd64_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.9279_none_08e667efa83ba076\msvcr90.dll
5830 INFO: Searching for file msvcp90.dll
5832 INFO: Found file C:\WINDOWS\WinSxS\amd64_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.9279_none_08e667efa83ba076\msvcp90.dll
5833 INFO: Searching for file msvcm90.dll
5835 INFO: Found file C:\WINDOWS\WinSxS\amd64_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.9279_none_08e667efa83ba076\msvcm90.dll
6032 INFO: Found C:\WINDOWS\WinSxS\Manifests\amd64_policy.9.0.microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.1_none_3da38fdebd0e6822.manifest
6033 INFO: Found C:\WINDOWS\WinSxS\Manifests\amd64_policy.9.0.microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.6161_none_acd388d7e1d8689f.manifest
6034 INFO: Found C:\WINDOWS\WinSxS\Manifests\amd64_policy.9.0.microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.9279_none_acd3d86fe1d846c4.manifest
6037 INFO: Adding redirect Microsoft.VC90.CRT version (9, 0, 21022, 8) -> (9, 0, 30729, 9279)
6175 INFO: Caching module hooks...
6180 INFO: Analyzing D:\my_git_repo\pzh-py-com\src\main.py
8021 INFO: Analyzing D:\my_git_repo\pzh-py-com\src\formatter.py
8024 INFO: Analyzing D:\my_git_repo\pzh-py-com\src\win.py
8040 INFO: Loading module hooks...
8040 INFO: Loading module hook "hook-wx.xrc.py"...
8046 INFO: Loading module hook "hook-encodings.py"...
8750 INFO: Looking for ctypes DLLs
8758 INFO: Analyzing run-time hooks ...
8766 INFO: Looking for dynamic libraries
9258 INFO: Looking for eggs
9258 INFO: Using Python library C:\WINDOWS\system32\python27.dll
9260 INFO: Found binding redirects:
[BindingRedirect(name=u'Microsoft.VC90.CRT', language=None, arch=u'amd64', oldVersion=(9, 0, 21022, 8), newVersion=(9, 0, 30729, 9279), publicKeyToken=u'1fc8b3b9a1e18e3b')]
9264 INFO: Warnings written to D:\my_git_repo\pzh-py-com\bin\build\jayspycom_main\warnjayspycom_main.txt
9287 INFO: Graph cross-reference written to D:\my_git_repo\pzh-py-com\bin\build\jayspycom_main\xref-jayspycom_main.html
9329 INFO: checking PYZ
9329 INFO: Building PYZ because out00-PYZ.toc is non existent
9330 INFO: Building PYZ (ZlibArchive) D:\my_git_repo\pzh-py-com\bin\build\main\out00-PYZ.pyz
9608 INFO: Building PYZ (ZlibArchive) D:\my_git_repo\pzh-py-com\bin\build\main\out00-PYZ.pyz completed successfully.
9648 INFO: checking PKG
9649 INFO: Building PKG because out00-PKG.toc is non existent
9651 INFO: Building PKG (CArchive) out00-PKG.pkg
9796 INFO: Redirecting Microsoft.VC90.CRT version (9, 0, 21022, 8) -> (9, 0, 30729, 9279)
14667 INFO: Building PKG (CArchive) out00-PKG.pkg completed successfully.
14674 INFO: Bootloader c:\tools_mcu\python27\lib\site-packages\PyInstaller\bootloader\Windows-64bit\runw.exe
14674 INFO: checking EXE
14677 INFO: Building EXE because out00-EXE.toc is non existent
14678 INFO: Building EXE from out00-EXE.toc
14695 INFO: SRCPATH [('..\img\jayspycom.ico', None)]
14697 INFO: Updating icons from ['..\img\pzh-py-com.ico'] to c:\users\nxa07314\appdata\local\temp\1\tmpcvu1zy
14698 INFO: Writing RT_GROUP_ICON 0 resource with 20 bytes
14698 INFO: Writing RT_ICON 1 resource with 4264 bytes
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目录下看到如下生成的文件:
```text
\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图片加载完成之后可以删除临时图片文件。思路有了,小伙伴赶紧动手试一试,这算是痞子衡在这个系列最后一课留给大家的一个课后作业。
相关推荐
- Linux 网络协议栈_linux网络协议栈
-
前言;更多学习资料(包含视频、技术学习路线图谱、文档等)后台私信《资料》免费领取技术点包含了C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,Z...
- 揭秘 BPF map 前生今世_bpfdm
-
1.前言众所周知,map可用于内核BPF程序和用户应用程序之间实现双向的数据交换,为BPF技术中的重要基础数据结构。在BPF程序中可以通过声明structbpf_map_def...
- 教你简单 提取fmpeg 视频,音频,字幕 方法
-
ffmpeg提取视频,音频,字幕方法(HowtoExtractVideo,Audio,SubtitlefromOriginalVideo?)1.提取视频(ExtractVi...
- Linux内核原理到代码详解《内核视频教程》
-
Linux内核原理-进程入门进程进程不仅仅是一段可执行程序的代码,通常进程还包括其他资源,比如打开的文件,挂起的信号,内核内部的数据结构,处理器状态,内存地址空间,或多个执行线程,存放全局变量的数据段...
- Linux C Socket UDP编程详解及实例分享
-
1、UDP网络编程主要流程UDP协议的程序设计框架,客户端和服务器之间的差别在于服务器必须使用bind()函数来绑定侦听的本地UDP端口,而客户端则可以不进行绑定,直接发送到服务器地址的某个端口地址。...
- libevent源码分析之bufferevent使用详解
-
libevent的bufferevent在event的基础上自己维护了一个buffer,这样的话,就不需要再自己管理一个buffer了。先看看structbufferevent这个结构体struct...
- 一次解决Linux内核内存泄漏实战全过程
-
什么是内存泄漏:程序向系统申请内存,使用完不需要之后,不释放内存还给系统回收,造成申请的内存被浪费.发现系统中内存使用量随着时间的流逝,消耗的越来越多,例如下图所示:接下来的排查思路是:1.监控系统中...
- 彻底搞清楚内存泄漏的原因,如何避免内存泄漏,如何定位内存泄漏
-
作为C/C++开发人员,内存泄漏是最容易遇到的问题之一,这是由C/C++语言的特性引起的。C/C++语言与其他语言不同,需要开发者去申请和释放内存,即需要开发者去管理内存,如果内存使用不当,就容易造成...
- linux网络编程常见API详解_linux网络编程视频教程
-
Linux网络编程API函数初步剖析今天我们来分析一下前几篇博文中提到的网络编程中几个核心的API,探究一下当我们调用每个API时,内核中具体做了哪些准备和初始化工作。1、socket(family...
- Linux下C++访问web—使用libcurl库调用http接口发送解析json数据
-
一、背景这两天由于一些原因研究了研究如何在客户端C++代码中调用web服务端接口,需要访问url,并传入json数据,拿到返回值,并解析。 现在的情形是远程服务端的接口参数和返回类型都是json的字符...
- 平衡感知调节:“系统如人” 视角下的架构设计与业务稳定之道
-
在今天这个到处都是数字化的时代,系统可不是一堆冷冰冰的代码。它就像一个活生生的“数字人”,没了它,业务根本转不起来。总说“技术要为业务服务”,但实际操作起来问题不少:系统怎么才能快速响应业务需求?...
- 谈谈分布式文件系统下的本地缓存_什么是分布式文件存储
-
在分布式文件系统中,为了提高系统的性能,常常会引入不同类型的缓存存储系统(算法优化所带来的的效果可能远远不如缓存带来的优化效果)。在软件中缓存存储系统一般可分为了两类:一、分布式缓存,例如:Memca...
- 进程间通信之信号量semaphore--linux内核剖析
-
什么是信号量信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)所拥有。信号量的值为正的时候,说明它空闲。所测试的线程可以锁定而使用它。若为0,说明它被占用,测试的线程要进入睡眠...
- Qt编写推流程序/支持webrtc265/从此不用再转码/打开新世界的大门
-
一、前言在推流领域,尤其是监控行业,现在主流设备基本上都是265格式的视频流,想要在网页上直接显示监控流,之前的方案是,要么转成hls,要么魔改支持265格式的flv,要么265转成264,如果要追求...
- 30 分钟搞定 SpringBoot 视频推拉流!实战避坑指南
-
30分钟搞定SpringBoot视频推拉流!实战避坑指南在音视频开发领域,SpringBoot凭借其快速开发特性,成为很多开发者实现视频推拉流功能的首选框架。但实际开发中,从环境搭建到流处理优...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)