pyinstaller 打包成 exe 遇到的一些坑

本文详细介绍了在使用pyinstaller将Python程序打包成exe文件时可能遇到的各种问题,并提供了具体的解决方法。包括不同版本Python的使用步骤、多进程与线程的处理、加入内置图片、赋予管理员权限等常见问题的解决策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在 window 系统下。

1、不同版本的 python 用 pyinstaller 打包exe详细步骤

此方法,也适用绿色(免安装)版的python打包。
1、首先在 cmd 中 cd 到需要打包的代码文件加中,
也可以直接在文件夹上方输入 cmd 直接进入文件夹中。如下图所示:
在这里插入图片描述
2、从需要用的 python版本 的安装目录下的 Scripts 文件夹中找到 pyinstaller.exe 文件,右键属性打开。然后复制完整的 路径名,如下图:
在这里插入图片描述
3、在第一步打开的 cmd 窗口中,输入 第二步复制的内容,再加上相关参数即可。
在这里插入图片描述
参数说明:
1、-F :加上这个参数,打包成一个EXE文件,如果不加则打包成一个文件夹。
2、 -w(小写):加上这个参数程序运行时不显示 控制台窗口(黑黑的那个窗口),不加上则显示。
3 和 4、-i:设置打包程序的图标,后面跟的是引用图标的名称,图片格式为ico格式。省略则显示默认图标。
5、 需要打包的 py 文件名(文件名最好不要为汉字,可能会出错)。
《具体参数介绍》

注:如果是正常安装版的python,直接 pyinstaller [参数] name.py 即可。
如果是 用 venv 的虚拟环境,先用 pip install pyinstaller安装后,再用 pyinstaller 命令即好。

2、pyinstaller 打包多进程、线程

用 pyinstaller 打包好exe后,双击运行,会出现无限循环的进入主程序的情况。
此时只要在调用多进程的前面加上如下的代码即可:

if __name__ == '__main__':    # 主要得加这句和下面这句。
    mp.freeze_support()       # 这句得加上,要不打包的程序就进不了下面的子进程了。
    p1 = mp.Process(target=callback, target=(, ))    # 示例进程
    p1.start()

知识点:
1、因为开启子进程是不支持打包exe文件的,所以会不停向操作系统申请创建子进程,
而这个代码 multiprocessing.freeze_support() 作用就是支持打包到Windows的EXE文件。

2、多进程的程序运行后,如果直接关闭控制台窗口,那么整个程序都会退出。
如果是 进入 任务管理器,单独结束 控制窗口 的进程,如果子进程不是守护进程,那么子进程还是会继续运行。

3、如果是多线程的,则没这个问题,可以直接打包。
但有个小提示, 如果是 tkinter 的图形界面运行的,是多线程的话,如果子线程不是守护线程,那么关掉主界面后,子线程会继续运行。
如果也是控制台窗口的话,效果和上面 2 提到的进程效果一样。

3、pyinstaller 打包一个EXE 并加入内置图片

1、先按正常方法打包:

pyinstaller -F -w name.py

2、在生成的文件中找到 name.spec 文件 (.spec后缀的文件)
用记事本打开,对其进行编辑。
在这里插入图片描述

在datas列表中添加数据格式为:
datas = [(‘source_path1’, ‘exe_dir1’), (‘source_path2’, ‘exe_dir2’)]
注释:
source_path1 :资源文件。
exe_dir1:把资源文件放在EXE程序中的文件夹。可以直接使用 英文的句号 即 ”.“,表示把资源文件放在EXE程序的顶级文件夹中。
列如 要把图片 ”C:\pic\name.jpg“ ,放入打包好的EXE程序中的 img文件夹中,可以这样写: datas=[(‘C:\pic\name.jpg’, ‘img’),]

3、最后得在源代码的图片路径引用中进行如下修改:

import os,sys
if getattr(sys, 'frozen', False):    # 查找 sys 中有没 frozen 属性,如果没有返回Fasle。
      							     # sys中的 'frozen' 属性 是打包成 一个EXE文件特有的属性。
        bundle_dir = sys._MEIPASS   
else:
        # 这是在没打包成一个EXE文件的情况下,文件的当前路径。
        bundle_dir = os.path.dirname(os.path.abspath(__file__))

filename ='pic.png'  # pic.png为图片名。
file_path = os.path.join(bundle_dir, filename) 

PyInstaller会将文件夹的路径信息存储在sys.MEIPASS中。当使用的是单文件打包的方式,sys.MEIPASS的值就是程序运行时创建_MEIxxxxxx临时目录的绝对路径。
路径一般在 C:\Users\用户名\AppData\Local\Temp\ _MEI1554654 (一串数字结尾的)

4、修改好 .spec 文件,和源代码,再次在cmd中输入:

pyinstaller name.spec

就可以生成带图片的EXE了。

4、打包程序使其具备管理员运行的权限

加上--uac-admin 参数
即:

pyinstaller --onefile --uac-admin script.py

官方文档参考
ps:
可用 auto-py-to-exe 包进行快速生成 exe 文件。
github地址

====================================================
如果打包时报错:
UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xce in position ***[某个数字]: invalid continuation byte

解决办法:在cmd 中输入 chcp 65001

CHCP 是一个计算机指令,能够显示或设置活动代码页编号。

65001: UTF-8代码页

950:繁体中文

936:简体中文默认的GBK

437: MS-DOS美国英语

引用[1]:【PythonPython项目打包发布(一)(基于Pyinstaller打包多目录项目) 【PythonPython项目打包发布(二)(基于Pyinstaller打包PyWebIO项目) 【PythonPython项目打包发布(三)(基于Aardio打包多目录项目) 【PythonPython项目打包发布(四)(基于Nuitka打包PySide6项目) 【PythonPython项目打包发布(五)(制作Windows安装包) 说明。 引用[2]:项目requirements.txt beautifulsoup4==4.11.2 bs4==0.0.1 certifi==2022.12.7 charset-normalizer==3.0.1 idna==3.4 Nuitka==1.4.8 numpy==1.24.2 ordered-set==4.1.0 PySide6==6.4.2 PySide6-Addons==6.4.2 PySide6-Essentials==6.4.2 requests==2.28.2 shiboken6==6.4.2 soupsieve==2.4 urllib3==1.26.14 。 引用[3]: 一、前言 最近为了做个数据处理的程序,考虑到在后面其他操作人员在任何电脑都能进行试验数据处理。因此需要将数据处理程序嵌入到界面中。使用者只需要运行.exe文件就能进行数据处理。之前有了解过python版本的PyQt5以及PySide2以及C 的Qt,但是都没有系统去学,为了在短时间内完成一个界面,我在B站找了白月黑羽.的一个视频,里面刚好有一个例子,于是我就直接用该程序进行了改进。大家可以看一下很容易理解,我当时也就看了前三个视频。然后直接用这个程序。写完程序之后就是需要打包,因为在以后的项目工程中,程序会进行模块化,一个项目会有很多文件,因为我这个程序相对比较简单,所以我只是用了两个文件,一个是Window.py,也就是窗口我呢见,另一个就是DataProces.py就是数据处理文件。在之前的打包中,习惯用的是pyinstaller -F -w name.py,这种是单文件打包。对于多文件,以及Pyside2这个特殊的包不适用本方法。下面就跟大家说一下我遇到过的一些问题。 二、踩报错之路 1.No Module named ‘PySide2’ 说明:本文有两个文件,其中一个是Window.py另一个是DataProcess.py 其中Window.py调用DataProcess.py模块。我一开始使用的打包命令时单文件打包。因为我之前打包过类似的小程序(不含PySide2库),改指令可以用,但是对于本文的情况不能用。 pyinstaller -F -w -i name.ico Name.py # 解释:-F 表示单文件打包 # -w:不带黑色弹窗 # -i name.ico 打包后的.exe软件显示图标。 # Name.py:就是我们需要打包的py文件 如果大家打包.exe对软件图标有要求,需要利用这个链接将图片转换为.ico格式,建议用网站转换,因为之前踩过,如果是自己手动更改后缀名会出现打包报错。同时直接复制粘贴的图片可能不是正方形的,对于长宽不相等的图标也会报错。这是个人的踩经验,大家可以借鉴一下。ico格式转换网址:迅捷PDF转换器. 2.This application failed to start because no Qt platform plugin could be initialized. 。 问题: pyside6打包部署pyinstaller 回答: 对于使用PySide6进行打包部署,可以参考以下步骤: 1. 确保在项目的requirements.txt文件中包含了PySide6的版本信息,例如PySide6==6.4.2。[2] 2. 使用PyInstaller进行打包时,需要使用特定的命令来处理PySide6这个特殊的包。对于多文件打包,可以使用以下命令: pyinstaller --add-data "path/to/PySide6/PySide6.dll;." --add-data "path/to/PySide6/Qt/plugins;Qt/plugins" your_script.py 这个命令会将PySide6.dll文件和Qt/plugins目录添加到打包后的可执行文件中。请将"path/to/PySide6"替换为实际的PySide6安装路径。[3] 3. 如果在打包过程中遇到"No Module named 'PySide2'"的错误,这是因为PyInstaller默认将PySide6识别为PySide2。可以尝试在打包命令中添加"--hidden-import PySide6"来解决这个问题。[3] 4. 如果在运行打包后的可执行文件时遇到"This application failed to start because no Qt platform plugin could be initialized"的错误,这是因为缺少Qt平台插件。可以将Qt/plugins目录添加到系统环境变量中,或者将Qt/plugins目录复制到打包后的可执行文件所在的目录中。[3] 通过以上步骤,您应该能够成功地使用PySide6进行打包部署。希望对您有帮助!
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值