用pyinstaller打包成exe走过的坑(py3.6+win10 64位)

Python打包exe与常见错误解决
本文分享了使用PyInstaller将Python脚本打包成exe文件的步骤与经验,包括安装配置、递归深度错误修正、编码问题处理及权限设置,并解决了运行时模块缺失的难题。

给做会计的小姐妹用Python写了个合表小工具,她不会Python,得打包给她用。搜了一下装 pyinstaller 可以搞定。找了个教程,三部曲:

  1. pip 安装一下
    pip install pyinstaller
    
  2. 下载安装 pyinstaller 运行时所需要的windows扩展pywin32
    链接地址这里。找到对应的 Python 版本和电脑系统版本下载,然后安装。
  3. 在命令窗口中输入 pyinstaller 指令就可以生成 exe 文件,file_name.py 是要处理的 py 文件的路径。
    pyinstaller -F file_name.py 
    

然后就开始漫长的各种 debug。。。。。。。


RecursionError: maximum recursion depth exceeded

就在命令窗口运行完上面的生成 exe 文件后,报错。咨询了 Python 专业的兄弟,是递归深度错误,要在 spec 文件里修改递归深度。找了一圈没找到 spec 文件,刚才运行了个鬼。还是到 py 文件所在目录再 run 一次 pyinstaller 吧。报错依旧,不过还好生成了 spec 文件,可以修改。
在 .spec 文件修改递归深度:
找到和 py 文件同名的 .spec 文件,打开它,加入这两行,定义了 5000 的递归深度。

import sys 
sys.setrecursionlimit(5000)

5000 够用了。改好之后再在命令窗口运行

pyinstaller file_name.spec 
UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xce in position 110: invalid continuation byte

终端的编码问题,在命令窗口输入

chcp 65001

解决。

PermissionError: [Errno 13] Permission denied: ‘C:\Users\***\AppData\Roaming\pyinstaller\bincache00_py36_64bit\ucrtbase.dll’

权限问题,查到一些其他解决办法,嫌麻烦。我试着改一下权限,改成自己的账号(***是我的电脑账号),丝滑运行~

runas /user:*** cmd

在命令窗口运行上面那行,输密码即可。
终于生成了 exe!!!

运行exe报错:No module named ‘pkg_resources.py2_warn’

运行 exe 文件,报错诶……

Traceback (most recent call last):
  File "site-packages\PyInstaller\loader\rthooks\pyi_rth_pkgres.py", line 13, in <module>
  File "g:\anaconda3\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 623, in exec_module
    exec(bytecode, module.__dict__)
  File "site-packages\pkg_resources\__init__.py", line 86, in <module>
ModuleNotFoundError: No module named 'pkg_resources.py2_warn'
[7152] Failed to execute script pyi_rth_pkgres

按照错误提示,找到 site-packages\pkg_resources\__init__.py 这个文件,简单粗暴把 86 行注释掉。再重新跑 file_name.spec 生成 exe。


完美解决~可以把工具发给小姐妹了!她那边要是出错我就不管了!

<think>嗯,我现在要解决用户的问题,就是在Win10下用PyInstaller打包Python程序exe,然后在Win7上运行时报错。用户已经提到了一些引用内容,我需要先仔细看看这些引用,然后结合自己的知识来找出解决方案。 首先,引用[1]提到报错是缺少api-ms-win-crt-process-l1-1-0.dll。这可能跟系统补丁有关。引用[2]指出这是因为Win7缺少补丁KB2533623。所以第一步应该检查并安装这个补丁。不过用户可能不太清楚怎么操作,可能需要指导他们如何下载和安装这个补丁。另外,这个补丁可能已经包含在Win7的更新中,所以建议用户先更新系统到最新。 然后引用[3]提到用户尝试了不同版本的PyInstallerpywin32,甚至复制dll文件都没功。这说明可能需要更全面的方法。Python 3.8可能默认使用了较新的VC++运行库,而Win7可能没有安装对应的版本。因此,可能需要安装VC++ 2015 redistributable,并且确认它适用于Win7。这时候可能需要建议用户安装VC++ 2015的更新3版本,因为它支持Win7。 引用[4]提到使用绝对路径来调用PyInstaller,这可能和路径设置有关,但可能不是导致跨系统问题的原因,不过可以作为打包时的建议步骤之一。 接下来,我需要考虑用户的具体情况。他们使用的是Python 3.8,而PyInstaller 4.4或5.0都试过了。Python 3.5之后的版本可能需要VC++ 2015的支持,所以Win7如果没有安装这个运行库就会出问题。因此,解决方案可能包括安装VC++ 2015 redistributable,并确保补丁KB2533623已安装。 另外,用户可能没有关闭杀毒软件,导致打包过程中某些文件被误删,或者生成exe被拦截,这也可能是一个问题。所以需要提醒用户暂时关闭杀毒软件再试。 还有,Python版本的问题。可能Python 3.8对Win7的支持不够好,建议降级到3.7或更早的版本,因为这些版本可能对Win7兼容性更好。或者使用PyInstaller的特定参数,比如--win-private-assemblies,来避免系统依赖的问题。 此外,打包时使用-F参数生成单个exe可能会增加兼容性风险,因为所有依赖都打包进去,但如果有系统级别的依赖缺失,仍然会出错。所以可能需要尝试不使用-F,或者确保所有依赖正确包含。 总结一下,解决方案应该分步骤:安装系统补丁,安装VC++运行库,使用兼容的Python版本,调整PyInstaller参数,关闭杀毒软件,以及可能的其他步骤如手动复制dll文件。需要逐一检查这些可能性,并给出明确的步骤指导。</think>### 分步解决方案:解决PyInstaller打包exeWin7运行报错问题 #### **1. 安装Win7系统补丁KB2533623** - **作用**:修复系统API兼容性问题,解决`api-ms-win-crt-*.dll`缺失报错[^2] - **操作步骤**: 1. 访问微软官方补丁目录:[KB2533623下载页面](https://www.catalog.update.microsoft.com/Search.aspx?q=KB2533623) 2. 根据系统数(32/64)下载对应补丁 3. 双击安装后重启系统 ```bash # 验证补丁是否安装功: # 打开cmd输入以下命令查看已安装补丁列表 wmic qfe list | find "KB2533623" ``` #### **2. 安装VC++ 2015运行库(需包含Win7支持)** - **原因**:Python 3.8+依赖VC++ 2015运行库,需确保Win7安装**含Update 3的版本** - **操作步骤**: 1. 下载微软官方VC++ 2015 redistributable(版本号≥14.0.24215): - [64系统](https://aka.ms/vs/16/release/vc_redist.x64.exe) - [32系统](https://aka.ms/vs/16/release/vc_redist.x86.exe) 2. 安装后重启系统 #### **3. 调整Python环境配置** - **推荐方案**:降级到Python 3.7或使用3.8的特定版本 ```bash # 使用conda创建Python 3.7环境 conda create -n py37 python=3.7 conda activate py37 pip install pyinstaller==4.4 pywin32==227 ``` - **替代方案**(保持Python 3.8): - 强制指定使用旧版运行库(需修改PyInstaller配置) #### **4. 修改PyInstaller打包参数** ```bash # 使用以下命令增加兼容性参数 pyinstaller --win-private-assemblies --add-data "pythoncom38.dll;." --add-data "pywintypes38.dll;." your_script.py ``` - **参数说明**: - `--win-private-assemblies`:隔离系统依赖 - `--add-data`:手动添加缺失的dll文件(需从`C:\Windows\System32`或Python安装目录复制) #### **5. 验证打包结果** - 在Win7虚拟机/实体机中运行exe前: 1. 关闭杀毒软件(避免误拦截) 2. 安装.NET Framework 4.6.1(部分依赖需要) #### **6. 高级处理(仍报错时)** - **手动嵌入dll文件**: 1.Win10系统目录`C:\Windows\System32`中复制以下文件: - `api-ms-win-crt-*.dll` - `ucrtbase.dll` 2. 通过PyInstaller参数`--add-data`包含这些文件 --- ### 相关问题 1. 如何验证Win7补丁KB2533623是否安装功? 2. PyInstaller的`--win-private-assemblies`参数具体作用是什么? 3. Python 3.8与Win7兼容性问题有哪些常见表现? --- > **引用说明**:VC++运行库和系统补丁的兼容性问题与Windows API调用机制直接相关[^2][^3],PyInstaller打包时默认依赖宿主机的运行环境[^4]。
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值