Pyinstaller打包用spec添加资源文件,亲测可用

2024-04-01 05:58

本文主要是介绍Pyinstaller打包用spec添加资源文件,亲测可用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近写的翻译软件——transdocx,就是给普通用户而非Python程序员用的,所以它必须是一个开箱即用的软件,普通用户下载下来就能双击运行。

Pyinstaller打包用spec添加资源文件

而Python作为一个脚本语言,要运行是必须有解释器的,它不能像C/C++那样编译成二进制。同样,也不能要求普通用户首先安装Python解释器、再安装依赖的包、最后运行transdocx。所以,需要把Python写好的软件打包成一个exe程序,让用户双击既可以使用。打包Python程序的最好的工具可能就是pyinstaller了。

下面我就结合transdocx打包的过程来讲讲pyinstaller的使用,平台是Windows,Linux和macOS类似。

一、用pyinstaller给纯Python代码打包

如果你的软件中只有.py文件,即Python代码文件,不包括图标、图片等资源文件,那么使用pyinstaller打包是非常简单的,往往只需要下面一行命令即可:

pyinstaller -F -w -i icon.ico transdocx.py

第一版本的transdocx就是这样完成的。其中的几个选项:
-F 把整个软件(包括依赖的各种库文件)打包成单一文件;
-w 禁止Windows的命令行窗口。不然双击exe时会打开一个黑乎乎的dos窗口;
-i 生成的exe文件会带有这个图标,有识别度也更好看;
最后的transdocx.py就是翻译软件的入口程序。

运行完上面的命令,会在当前目录下生成一个transdocx.spec文件和两个文件夹build和dist,其中dist里面就是最终生成的exe文件,把这个文件发给普通用户就可以了。当然,你要先自己测试没有问题。

transdocx.spec 是于pyinstaller生成的配置文件,下次打包时,可以不运行上面带参数的命令,而直接运行:

pyinstaller transdocx.spec

二、用pyinstaller给带有资源文件的代码打包

第二版为了支持PDF,添加了目录bin/下面的相关资源文件,主要是:
pdftotext.exe : Windows下面的提取PDF文本内容的命令行工具;
pdftotext : Linux下面提取PDF文本内容的命令行工具;
default.docx : 生成docx的默认模板文件。

提取PDF内容是通过Python的subprocess模块调用命令行工具pdftotext.exe 实现的。如果按照上面比较简单的打包方式,就会报错:找不到这个命令行工具。因为这些资源文件没有被打包到最终的exe文件。

要把这些资源文件包含进去,可以给pyinstaller添加选项,也可以修改spec文件。我通过修改transdocx.spec来实现:

给spec添加资源文件路径

(关于spec的说明可以查看pyinstaller的官方文档)
添加过程还是很简单的,看图中红框部分就是。
前面pyinstaller 自动生成的spec文件中,binaries原本是空的:

binaries=[]

就是一个空的list,把要添加的资源文件以tuple的形式传入,tuple的第一个元素是资源文件的路径,第二个元素是打包后存放资源的文件夹。比如:

(‘./bin/pdftotext.exe’, ‘bin’)

就是把 ‘./bin/pdftotext.exe’ 打包后放到bin目录下面。打包后的目录跟Python代码的目录结构一直即可,pdftotext.exe原先放在bin下面可以让程序运行,那么打包后也放在bin下面即可。

在spec文件中添加好要包含的资源文件再次打包就可以把资源文件打包到最终的exe文件了。然而,这时得到的最终exe还是不能运行! 报的错误还是找不到相关文件。

三、修改资源文件路径以保证打包结果能执行

为什么还不能运行?这样从pyinstaller打包后的exe的运行机制讲起。打包得到的exe文件是一个可自解压的程序,它会把这个exe文件中包含的文件打包到一个名为 _MEIxxxxxx 的临时目录下面,这个目录在系统的临时文件夹下面(Linux下是 /tmp),当程序退出时,会自动清空删除这个临时目录 _MEIxxxxxx。

我们先来看看这个临时目录 _MEIxxxx 里面都是些什么,下面截图是Linux下面的,Windows类似,只不过路径不一样,Windows下是.dll等。

spec mei临时目录

其中的bin目录下就是我添加的资源文件。

最终的exe文件有可能放在任何目录执行,其当前目录下不会有bin目录下面的资源文件,而是被解压到了临时目录下面,所以程序报错找不到相关文件。

因此,我们要在程序中指定资源文件的路径,使得它在非打包模式和打包模式下运行时都能找到相关资源文件。这需要添加一个路径解析函数:

给spec添加一个路径解析函数

这个函数很简单,把资源的相对路径转换为绝对路径。如果找到 _MEIPASS 路径就以此为资源的基准路径,否则以当前路径为基准路径。

代码中任何使用资源文件的相对路径都用该函数转换一下即可保证资源文件可以被找到。比如代码中:

转换spec资源文件路径

可以从transdocx的源码中查找更多resource_path的示例。

至此,打包的问题完美解决了。再次使用spec打包一下,看看exe应该可以正常运行了。

双击exe运行正常,选取一个PDF文件,点击“翻译”。纳尼?!又报错!!

双击pyinstaller打包后的程序出错

一番搜索后,stackoverflow上找到了原因:
https://stackoverflow.com/questions/337870/

问题出在subprocess上面:

要使用subprocess pipe来打包

简单来说就是,打包是关闭了命令行窗口,stdin, stdout 无处安放。
所以,把它们用subprocess.PIPE 管道代替即可。
shell=True 可以防止执行subprocess.Popen()时闪现一个黑糊糊的dos窗口。

这时候,才算完美解决了pyinstaller打包的问题。总结一下pyinstaller打包的过程:
(1)pyinstaller -F -w xxx.py;
(2)修改上一把生成的xxx.spec文件,添加资源文件;
(3)pyinstaller xxx.spec 打包为exe文件。

这篇关于Pyinstaller打包用spec添加资源文件,亲测可用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/866373

相关文章

C++中RAII资源获取即初始化

《C++中RAII资源获取即初始化》RAII通过构造/析构自动管理资源生命周期,确保安全释放,本文就来介绍一下C++中的RAII技术及其应用,具有一定的参考价值,感兴趣的可以了解一下... 目录一、核心原理与机制二、标准库中的RAII实现三、自定义RAII类设计原则四、常见应用场景1. 内存管理2. 文件操

Python程序打包exe,单文件和多文件方式

《Python程序打包exe,单文件和多文件方式》:本文主要介绍Python程序打包exe,单文件和多文件方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python 脚本打成exe文件安装Pyinstaller准备一个ico图标打包方式一(适用于文件较少的程

Maven项目打包时添加本地Jar包的操作步骤

《Maven项目打包时添加本地Jar包的操作步骤》在Maven项目开发中,我们经常会遇到需要引入本地Jar包的场景,比如使用未发布到中央仓库的第三方库或者处理版本冲突的依赖项,本文将详细介绍如何通过M... 目录一、适用场景说明​二、核心操作命令​1. 命令格式解析​2. 实战案例演示​三、项目配置步骤​1

Kali Linux安装实现教程(亲测有效)

《KaliLinux安装实现教程(亲测有效)》:本文主要介绍KaliLinux安装实现教程(亲测有效),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、下载二、安装总结一、下载1、点http://www.chinasem.cn击链接 Get Kali | Kal

Nginx使用Keepalived部署web集群(高可用高性能负载均衡)实战案例

《Nginx使用Keepalived部署web集群(高可用高性能负载均衡)实战案例》本文介绍Nginx+Keepalived实现Web集群高可用负载均衡的部署与测试,涵盖架构设计、环境配置、健康检查、... 目录前言一、架构设计二、环境准备三、案例部署配置 前端 Keepalived配置 前端 Nginx

Spring Boot项目打包和运行的操作方法

《SpringBoot项目打包和运行的操作方法》SpringBoot应用内嵌了Web服务器,所以基于SpringBoot开发的web应用也可以独立运行,无须部署到其他Web服务器中,下面以打包dem... 目录一、打包为JAR包并运行1.打包为可执行的 JAR 包2.运行 JAR 包二、打包为WAR包并运行

Python将字库文件打包成可执行文件的常见方法

《Python将字库文件打包成可执行文件的常见方法》在Python打包时,如果你想将字库文件一起打包成一个可执行文件,有几种常见的方法,具体取决于你使用的打包工具,下面就跟随小编一起了解下具体的实现方... 目录使用 PyInstaller基本方法 - 使用 --add-data 参数使用 spec 文件(

Redis高可用-主从复制、哨兵模式与集群模式详解

《Redis高可用-主从复制、哨兵模式与集群模式详解》:本文主要介绍Redis高可用-主从复制、哨兵模式与集群模式的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录Redis高可用-主从复制、哨兵模式与集群模式概要一、主从复制(Master-Slave Repli

将Java程序打包成EXE文件的实现方式

《将Java程序打包成EXE文件的实现方式》:本文主要介绍将Java程序打包成EXE文件的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录如何将Java程序编程打包成EXE文件1.准备Java程序2.生成JAR包3.选择并安装打包工具4.配置Launch4

PyInstaller打包selenium-wire过程中常见问题和解决指南

《PyInstaller打包selenium-wire过程中常见问题和解决指南》常用的打包工具PyInstaller能将Python项目打包成单个可执行文件,但也会因为兼容性问题和路径管理而出现各种运... 目录前言1. 背景2. 可能遇到的问题概述3. PyInstaller 打包步骤及参数配置4. 依赖