Pyinstaller 生成 exe 及打包资源文件

本文详细介绍了如何使用Pyinstaller将Python程序打包成exe文件,包括单文件和包含资源文件的打包方式,并讲解了如何去除命令行窗口,提供了具体的命令行参数和操作步骤,适用于Windows环境。

其他 Pyinstaller 打包技巧见《Python程序打包指南


Pyinstaller 不仅可以打包 .py 文件为 exe ,还可以将依赖的其他资源文件(如图片、音频等媒体文件)也打包到程序中。

pyinstaller 支持两种打包模式,一种是单文件的exe,适合功能简单,体积小的程序;另一种是打包为文件夹,里边包含一个 exe 可以执行。平时我们见到的绿化程序很多都属于是单文件程序,比如我们写了一个小脚本,寥寥数行代码,打包成一个文件夹显然不方便分享,这就可使用Pyinstaller打包成一个exe,便于传发。

本文使用的环境为:Win11 X64Python 3.8.xPyinstaller 4.9

本文主要介绍四部分:1. 如何使用 pyinstaller 打包 .py文件为 exe; 2. 如何生成单文件 exe; 3.如何去掉命令行窗口; 4. 如何打包其他资源文件,如图片、文件夹等

一、将 .py 文件打包为 exe

这部分主要讲打包py文件的常用命令和方法,同时附带演示代码和演示效果以及命令解析。

1.1、打包命令

# 将 xx.py 打包
pyinstaller xx.py

默认就是以文件夹形式打包,会生成一个 build 文件夹dist 文件夹 ​pyinstaller -D xx.py命令效果相同,具体演示效果见下文示例演示

1.2、命令解析

xx.py表示代码文件名为 xx.py,-D表示打包为文件夹

1.3、示例演示

示例代码⬇️:

# 先安装 pip install pysimplegui
import PySimpleGUI as sg  

layout = [
	[sg.Text('请输入内容:')],  
	[sg.InputText()],  
	[sg.Submit('确认'), sg.Cancel('取消')]
] 

window = sg.Window('Demo示例', layout)  

event, values = window.read()   

text_input = values[0]  
sg.popup('你输入了:', text_input)

执行打包⬇️:

运行打包命令pyinstaller -D test.py,最后提示... completed successfully就是成功了,别的不认识也没关系。
在这里插入图片描述

打包效果如下⬇️:

我们可以清楚的看到test.py的同级目录下生成了build文件夹dist文件夹test.spec文件⬇️。dist文件夹下和xx.py文件同名的文件夹,这个就是我们打包出来的程序文件夹;而 build文件夹 是程序打包时构建过程生成的,我们无法直接使用,对于我们来讲没什么用,而test.spec文件是打包的中间配置文件,下边第四部分,我们通过修改这个文件来实现资源文件的打包。
在这里插入图片描述

dist文件夹即是我们程序打包好的文件夹,可以将这个文件夹分享给其他人,点击文件夹内的test.exe就可以运行程序,具体效果如下⬇️:
在这里插入图片描述

可以看的出来,完全没有问题!!!至此,我们就完成了程序的打包。

二、打包单为文件

在实际的应用中,有时候我们需要制作一些小工具,为了方便分发,常常打包为一个单文件的exe,这时候就需要使用-F参数。本小节主要讲解如何打包单文件exe,附带演示代码和效果以及命令解析,具体用法和效果如下:

2.1、打包命令

pyinstaller -F xx.py

2.2、命令解析

-F表示打包为单文件xx.py表示代码文件名为xx.py

2.3、示例演示

示例代码⬇️:

这里我们编写一个示例代码,我就直接引用我的另一篇博文《Python GUI-PySimplegui》中的代码来编写一个GUI程序

# 先安装 pip install pysimplegui
import PySimpleGUI as sg  

layout = [
	[sg.Text('请输入内容:')],  
	[sg.InputText()],  
	[sg.Submit('确认'), sg.Cancel('取消')]
] 

window = sg.Window('Demo示例', layout)  

event, values = window.read()   

text_input = values[0]  
sg.popup('你输入了:', text_input)

这个程序的实际运行效果是这样的⬇️:
在这里插入图片描述

执行打包⬇️:

接下来我们开始打包,运行打包命令pyinstaller -F test.py

打包效果如下⬇️:
双击运行一下试试看
在这里插入图片描述
运行成功!!!说明我们打包成功了。最后看一下文件属性,大小约10M
在这里插入图片描述

其实单文件的 exe 在执行的时候也是需要释放资源文件的,不过是释放在了系统默认的缓存位置,如果是软件稍复杂,那么打开就比较慢😑,这时候就不适合打包成单文件程序,而是打包为一个文件夹。

三、去掉命令行窗口

双击运行test.exe时,后边会出现一个黑框,也就是命令行,如果是GUI程序,我们就是需要去掉,不然那体验就太糟糕了😑。本小节主要讲解如何去掉这个黑窗口,同时讲解如何利用命令行窗口辅助调试程序,附带演示代码和效果以及命令解析

3.1、设置参数

可以通过添加w参数去掉黑乎乎的命令行窗口,在-F命令后增加w即可(-F-w参数一起使用的话,应为-Fw,而不是-F -w
假设之前打包的命令是pyinstaller -F xxx.py,现在改为pyinstaller -Fw xxx.py即可

3.2、设置效果如下

在这里插入图片描述

可以看到,命令行窗口就隐藏掉了(这里因为我的系统主题设置的黑色,所以动图那么显眼,对比上一张图可以看出是隐藏掉了)

3.3、命令行窗口在调试中的作用

在我们正式打包之前,需要打包测试是否可以正常运行,这时候需要保留命令行窗口来辅助调试。这个窗口可以输出调试的信息:
例如我们在示例代码中加入打印输入内容的语句

print('#>>:'+values[0])

完整代码如下⬇️:

# 先安装 pip install pysimplegui
import PySimpleGUI as sg  

layout = [
	[sg.Text('请输入内容:')],  
	[sg.InputText()],  
	[sg.Submit('确认'), sg.Cancel('取消')]
] 

window = sg.Window('Demo示例', layout)  

event, values = window.read()   

text_input = values[0]   
 
print('#>>:'+values[0])

sg.popup('你输入了:', text_input)

演示效果如下⬇️:
在这里插入图片描述

在测试完成没有问题后,即可增加w参数重新打包!!再分发给其他小伙伴。

四、打包组资源文件

有时候我们需要在打包的程序中调用一些资源文件,但是 pyinstaller 并不会自动的帮我们打包进去,每次都得手动复制进去,比较麻烦😡.其实可以配置 pyinstaller 让他打包的时候自动复制进去,这时候就需要我们手动去更改.spec文件了。本小节主要介绍如何修改.spec文件来实现自动打包资源文件,附带演示代码和效果以及命令解析。

4.1、Spec文件分析

细心的小伙伴可能发现,打包的时候,程序同路径下会生成一个同名的.spec文件,这个文件是打包的 “中间文件”,我们可以通过修改这个文件来添加需要添加资源的文件。

.spec文件中主要包含4部分:AnalysisPYZEXECOLLECT

  • Analysis:主要是分析 py 文件的依赖信息
  • PYZ:是一个.pyz的压缩包,包含程序运行需要的依赖
  • EXE:是根据上述两项内容而生成的
  • COLLECT:主要是输出信息

这里放一个spec文件的Analysis部分截取作为示例:

# -*- mode: python ; coding: utf-8 -*-
a = Analysis(
             ......
             datas=[],
             ......
             )

4.2、Spec文件修改实现打包资源文件

想要添加资源文件,重点是修改datas的内容,我这里是修改过的,一般是空的:datas = []
datas ​里边的元素是以元组的形式来存储的,有这么一个映射关系:

datas = [('源文件路径','目标路径')]

如果有多个文件需要拷贝到程序中,就多写几个元组,记得映射关系不要搞错,有一点比较特殊:如果目标路径打包后的根目录,那就写.,这里讲的比较抽象,可以看下边的示例演示

4.3、重新打包:

重新运行打包命令pyinstaller -D xx.spec即可,不过这里后的对象不再是xx.py文件,而是xx.spec文件。

4.4、示例演示

示例代码⬇️:
代码我们依旧使用test.py,稍加修改:

import PySimpleGUI as sg  

layout = [
	[sg.Image('./ico.png')],  # 加载根目录下的图片      
	[sg.Submit('确认'), sg.Cancel('取消')]
] 

window = sg.Window('Demo示例', layout)  

event, values = window.read()   

现在的目录结构现在是这样的:
在这里插入图片描述

先运行一下,可以看到程序没问题是,可以加载到图片的:
在这里插入图片描述

接下来我们先运行打包命令,为了让他先生成.spec文件:

pyinstaller -D -w test.py

试运行⬇️:

我们可以尝试运行一下生成的test.exe,看程序是否运行正常:
在这里插入图片描述

可以看到,我们的程序在挠头,提示无法加载到./ico.png文件,这是因为ico.png文件没有一起打包到程序目录下

修改test.spec文件将图片打包进去⬇️:

这时可以删掉builddist文件夹,这两个没用了,一会要重新生成。然后我们修改test.spec文件,记事本或者VSC打开即可:
在这里插入图片描述

重点修改详解⬇️:

  • (‘./ico.png’,‘.’):表示将ico.png复制到打包目录的根目录下(.表示根目录)
  • (‘asset’,‘asset1’):表示将asset文件夹,复制到打包目录asset1目录下。

重新打包,同时打包资源文件⬇️:

运行命令pyinstaller -D xx.spec,可以看到,我们设置的都打包进来了:
在这里插入图片描述

运行效果如下⬇️:
在这里插入图片描述

可以看出,完全正常!!至此,Pyinstaller 打包我们就讲述完毕了,有问题的小伙伴欢迎留言讨论。

<think>我们正在处理用户关于如何使用PyInstallerPython脚本转换为EXE文件的问题。根据用户的问题,我们需要提供清晰的步骤和注意事项。同时,根据系统指令,我们需要在回答中使用正确的LaTeX格式,生成相关问题,并在引用内容后添加引用标识。 用户的问题:如何使用PyInstallerPython脚本转换为EXE文件? 根据提供的引用资料,我们可以总结如下: - 引用[1]:PyInstaller可以将Python程序打包Windows(也包括Linux, Mac OS X等)下可执行的EXE文件,支持python2.2-2.7版本。 - 引用[2]:使用`pyinstaller mytest.py`命令会生成一个.spec文件和一个dist文件夹,其中dist文件夹包含可执行文件。如果希望生成单个EXE文件,可以使用`pyinstaller --onefile mytest.py`。 - 引用[3]:展示了使用py2exe的示例,但用户询问的是PyInstaller,所以这个引用可能不是直接相关的,但我们可以忽略它,除非有交叉参考的需要。 - 引用[4]:关于PyQt的文件对话框示例,与打包无直接关系。 - 引用[5]:提到了打包时可以使用`-p`或`--paths`选项来指定导入模块的搜索路径。 因此,我们将重点放在PyInstaller的使用上。 回答步骤: 1. 安装PyInstaller 2. 基本用法:打包为单个文件夹 3. 打包为单个可执行文件(--onefile) 4. 其他常用选项(如添加图标、隐藏控制台窗口等) 5. 注意事项 另外,根据系统指令,我们需要在行内数学表达式使用$...$,独立公式使用$$...$$,但本问题可能不涉及数学公式,所以可以忽略数学表达式的部分。但需要生成相关问题,并在引用处添加标识。 回答结构: - 先介绍PyInstaller - 逐步说明使用方法 - 示例代码(命令行) - 注意事项 - 生成相关问题 注意:引用资料中提供的引用标识[^1][^2]等,我们在回答中引用时使用相同的标识。 开始回答:</think>### 如何使用 PyInstallerPython 脚本转换为 EXE 文件 #### 1. **安装 PyInstaller** 在命令行中执行以下命令安装最新版 PyInstaller: ```bash pip install pyinstaller ``` #### 2. **基础打包命令** ```bash pyinstaller your_script.py ``` - 生成结果: - `dist/` 文件夹:包含所有依赖文件和可执行文件 `your_script.exe` - `build/` 文件夹:临时编译文件 - `your_script.spec`:配置文件[^2] #### 3. **生成单个 EXE 文件(推荐)** 添加 `--onefile` 参数将所有文件打包成单个 EXE: ```bash pyinstaller --onefile your_script.py ``` - 输出:`dist/your_script.exe`(单个可执行文件)[^2] #### 4. **常用高级参数** | 参数 | 作用 | 示例 | |------|------|------| | `--icon` | 添加应用图标 | `--icon=app.ico` | | `--noconsole` | 隐藏控制台窗口(GUI程序) | `--noconsole` | | `--add-data` | 添加资源文件 | `--add-data "images;images"` | | `--paths` | 指定模块搜索路径 | `--paths=C:\custom_libs`[^5] | | `--hidden-import` | 强制包含隐藏模块 | `--hidden-import=sip`[^3] | #### 5. **处理依赖问题** - **问题**:打包后缺失模块(如 PyQt、Pandas) - **解决方案**: 1. 在 spec 文件中手动添加路径: ```python a = Analysis(... pathex=['C:\\Python\\Lib', 'C:\\custom_path'], # 添加路径 hiddenimports=['sip', 'PyQt5'], # 添加隐藏模块 ) ``` 2. 或通过命令行: ```bash pyinstaller --paths "C:\Python\Lib\site-packages\PyQt5" --onefile your_script.py ``` #### 6. **验证打包结果** - 在 `dist/` 目录下直接运行 EXE 文件 - 若报错缺失 DLL,可尝试: ```bash pyinstaller --onefile --add-binary "msvcp90.dll;." your_script.py # 包含特定DLL[^3] ``` #### 7. **完整示例** 打包 PyQt5 程序并添加图标: ```bash pyinstaller --onefile --noconsole --icon=app.ico --paths "C:\Python\Lib\site-packages\PyQt5\Qt\bin" main.py ``` > **注意事项**: > 1. 确保打包环境与目标系统位数一致(32/64位) > 2. 复杂项目建议先用 `--onedir` 调试依赖,再转 `--onefile` > 3. 杀毒软件可能误报 PyInstaller 生成EXE,需添加信任[^1] --- ### 相关问题 1. PyInstaller 打包EXE 文件过大,如何优化体积? 2. 如何处理 PyInstaller 打包时的 "ModuleNotFoundError" 错误? 3. 如何为 PyInstaller 打包EXE 文件添加版本信息和数字签名? [^1]: PyInstaller 支持多平台和 Python 2.2-2.7 版本 [^2]: 使用 `--onefile` 可生成单个 EXE 文件 [^3]: 需处理隐藏导入和 DLL 排除问题 [^5]: 通过 `--paths` 指定模块搜索路径
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YumOS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值