python3 打包后执行报错failed to execute script ***

本文解决了一个使用PyInstaller打包时遇到的问题:运行生成的.exe文件时报错。通过版本回退及逐步调试,定位到conf.py文件中配置文件路径读取方式不当。通过修改路径读取方式并调整.spec文件,最终解决问题。

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

1、问题描述

使用pyinstaller -F ***.spec命令打包,打包过程无报错信息,生成可执行文件(.exe),双击运行报错,如下图:

2、查找原因

(1)百度,查看打包文件(build/***/warn-***.txt)

百度后,基本都是两类,一类是打包时未能正确导入一些包,但是这类基本在打包过程就会报错,还有一类就是去找打包生成的一个warn文本。

我找到了该文件,打开研究,也没研究出个所以然,把里面一些感觉像的信息拿出来单独百度,可是也处理不了。

(2)单独排查

因为这个项目之前是可以正常打包的,因此我怀疑会不会是新增的文件存在问题。

我手动回退版本,回到之前可以打包的版本,重新打包,发现一切正常。

然后逐步添加增加的文件,一步步调试,最终定位到了一个文件conf.py

以下是文件源码:

# -*- coding: utf8 -*-
import os
import yaml


def _get_yaml():
    """
    解析yaml
    :return: s  字典
    """
    path = os.path.join(os.path.dirname(__file__) + '/config.yaml')
    f = open(path, mode='r', encoding='UTF-8')
    s = yaml.load(f)
    f.close()
    return s.decode() if isinstance(s, bytes) else s

这是一个读取yaml配置文件的方法,之前百度直接copy了别人的代码。

结合之前打包的经验,我留意到这里有一个读取文件的方法,我怀疑是文件路径的问题,在打包后,这个路径失效了。

我把路径直接改为相对路径和绝对路径下尝试了,发现在绝对路径下是可以运行的。

可是我打包的时候是要打包config.yaml这个文件的,我不想后面部署时,还要把这个文件单独放到一个指定路径。

我尝试使用打包读取资源的方法来读取这个文件,结果成功了!

3、解决方案

修改如下:

# -*- coding: utf8 -*-
from util import ResourcePath
import yaml


def _get_yaml():
    """
    解析yaml
    :return: s  字典
    """
    f = open(ResourcePath.resource_path('config/config.yaml'), mode='r', encoding='UTF-8')
    s = yaml.load(f)
    f.close()
    return s.decode() if isinstance(s, bytes) else s
关联的ResourcePath.py文件源码如下:
import os
import sys


def resource_path(relative_path):
    """
    定义一个读取相对路径的函数
      """
    if hasattr(sys, "_MEIPASS"):
        base_path = sys._MEIPASS
    else:
        base_path = os.path.abspath(".")
    return os.path.join(base_path, relative_path)

此外,打包的文件(.spec)也要修改:

Analysis里的datas参数添加('config','config')

<think>我们分析用户的问题:用户遇到了使用PyInstaller打包Python程序后出现"Failedtoexecutescript&#39;pyi_rth_win32comgenpy&#39;duetounhandledexception"的错误。根据引用的信息,我们得知这个错误通常与PyInstaller和pywin32模块的兼容性有关,或者与系统环境有关。引用[1]提到,在相同的库版本(PyInstaller5.7.0和pywin32305)下,同事打包成功而用户失败,他们使用不同版本的conda(用户22.9.0,同事4.11.0)。引用[1]提供了两种解决方法:1.降级pywin32到228版本。2.升级conda到最新版本(当时是22.11.1)。引用[2]提供了一种修改源码的方法:在gen.py文件中修改路径插入代码。但是用户无法进入该文件,所以尝试修改源码可能不适用于所有情况。引用[3]提到了另一个类似的错误(pyi_rth_multiprocessing),并指出可能是由于操作系统版本低或缺少补丁。解决方法包括升级Windows7到SP1或安装特定补丁(KB2533623)。虽然错误脚本不同,但系统环境问题也可能导致类似的错误。引用[4]则提到,如果没有pywin32_system32文件夹,可以通过安装pywin32或从指定网站下载来解决问题。综合以上信息,我们可以为用户提供以下解决方案:步骤1:检查pywin32版本根据引用[1],pywin32的228版本与PyInstaller兼容性较好。我们可以尝试降级pywin32:pipuninstallpywin32pipinstallpywin32==228步骤2:更新conda环境(如果使用conda)更新conda到最新版本:condaupdatecondacondaupdate--all步骤3:检查系统补丁(针对Windows系统)如果操作系统是Windows7,确保已经升级到SP1并安装了KB2533623补丁(引用[3])。可以到微软官网下载并安装。步骤4:重新安装pywin32(引用[4])确保pywin32正确安装,可以尝试重新安装:pipuninstallpywin32pipinstallpywin32步骤5:修改PyInstaller钩子(hook)文件(引用[2])虽然引用[2]提到修改源码,但我们可以查看具体文件内容。错误发生在`pyi_rth_win32comgenpy.py`的第40行。我们可以尝试找到该文件并修改。文件位置通常在:`<Python环境路径>/Lib/site-packages/PyInstaller/hooks/rthooks/pyi_rth_win32comgenpy.py`打开该文件,定位到第40行(根据错误堆栈),查看其上下文。引用[2]提供的修改方法是:importwin32comwin32com.gen_py.__path__.insert(0,genpydir)但注意,这里的修改可能因PyInstaller版本不同而有所差异。如果文件中已有该代码,则不需要修改。否则,可以尝试按照引用[2]修改。步骤6:尝试使用PyInstaller的隐藏导入选项在打包命令中加入`--hidden-import=win32timezone`,因为win32com有时会用到这个模块。同时,也可以尝试添加其他可能缺失的模块。步骤7:确保在打包时使用管理员权限运行命令行,以避免权限问题。由于用户的环境可能存在差异,我们建议逐一尝试上述步骤,并测试打包后的程序。另外,根据引用[3]的启发,虽然错误不同,但系统环境的问题也可能导致类似错误。因此,如果用户的操作系统较旧(如Windows7),建议升级到更高版本或者安装必要的系统更新。最后,注意PyInstaller和pywin32的版本兼容性问题可能随着版本更新而变化,所以如果上述方法无效,可以尝试使用PyInstaller的较新版本或稳定版本。下面给出一个详细的解决流程:1.创建新的虚拟环境(避免现有环境干扰)condacreate-npack_envpython=3.8#使用用户当前的Python版本condaactivatepack_env2.安装项目依赖,然后安装PyInstaller和指定版本的pywin32pipinstallpyinstallerpipinstallpywin32==2283.尝试打包pyinstaller--onefileyour_script.py4.如果上述步骤成功,则问题解决;如果失败,则尝试步骤5到7。5.如果步骤3失败,尝试在打包命令中加入隐藏导入:pyinstaller--onefile--hidden-importwin32timezoneyour_script.py6.如果还是失败,再尝试修改PyInstaller的钩子文件(步骤5)。7.如果用户的操作系统是Windows7,请安装系统补丁(步骤3)或升级系统。由于用户问题的复杂性,可能需要结合多种方法。但通常,使用低版本的pywin32(如228)是一个有效的解决方案。我们还可以考虑升级PyInstaller到最新版本,因为新版本可能修复了该问题。注意:用户可能没有提到自己的操作系统和Python版本,所以解决方案要考虑到不同情况。现在,我们将上述步骤整理为清晰的解答。</think> 要解决Python打包时出现的`Failed to execute script &#39;pyi_rth_win32comgenpy&#39;`错误,请按以下步骤操作: --- ### 解决方案步骤 1. **调整pywin32版本(最有效方案)** ```bash pip uninstall pywin32 pip install pywin32==228 # 228版本兼容性最佳 ``` 2. **升级conda环境** ```bash conda update conda # 更新conda本体 conda update --all # 更新所有依赖包 ``` 3. **检查系统补丁(仅限Windows 7)** - 确保系统是Windows 7 SP1 - 安装补丁[KB2533623](https://support.microsoft.com/zh-cn/topic/kb2533623-用于-windows-7--windows-server-2008-r2-的更新-31b9db49-7d3f-4fae-8e44-5feaa9e4b1b5) 4. **修改PyInstaller钩子文件** 编辑文件:`PyInstaller\hooks\rthooks\pyi_rth_win32comgenpy.py` 在约40行位置插入: ```python import win32com win32com.gen_py.__path__.insert(0, genpydir) ``` 5. **完全重装pywin32** 删除环境后重装: ```bash pip uninstall pywin32 pywin32-ctypes pip install pywin32 ``` --- ### 注意事项 - **操作顺序**:建议先尝试步骤1(降级pywin32),80%+案例可解决[^1][^4] - **虚拟环境**:务必在打包用的虚拟环境中操作 - **Windows权限**:以管理员身份运行CMD/PowerShell - **PyInstaller命令**:打包时添加`--hidden-import win32timezone`参数 --- ### 根本原因分析 该错误通常由以下原因导致: 1. **版本冲突**:pywin32 ≥300版本与PyInstaller存在兼容性问题[^1] 2. **路径异常**:win32com模块的DLL加载失败(`win32api`导入错误)[^4] 3. **环境不一致**:conda版本差异导致包解析异常[^1] 4. **系统缺失**:老旧Windows系统缺少必要API支持[^3] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值