pyinstaller打包py文件生成的exe报错Failed to execute script

版权声明:转载请注明作者(独孤尚良dugushangliang)出处:https://blog.csdn.net/dugushangliang/article/details/100761976

 

时常觉得pyinstaller的打包很玄幻,不一定成功了失败了,平常也是绕着走,遇到问题束手无策。

本次打包,导入了两个:re/socket。

直接打包后生成的exe文件报错Failed to execute script。

我怎么打包的呢?

参阅https://blog.csdn.net/dugushangliang/article/details/81983168

pyinstaller --onefile fa.py -w

打包时cmd所在文件夹中会有build文件夹,其内只有一个同名于打包py文件名的文件夹,这个文件夹内会有一个warn开头的后面名字同名于py文件的txt文件,打开这个txt文件,如下:


This file lists modules PyInstaller was not able to find. This does not
necessarily mean this module is required for running you program. Python and
Python 3rd-party packages include a lot of conditional or optional module. For
example the module 'ntpath' only exists on Windows, whereas the module
'posixpath' only exists on Posix systems.

Types if import:
* top-level: imported at the top-level - look at these first
* conditional: imported within an if-statement
* delayed: imported from within a function
* optional: imported within a try-except-statement

IMPORTANT: Do NOT post this list to the issue-tracker. Use it as a basis for
           yourself tracking down the missing module. Thanks!

missing module named resource - imported by posix (top-level), C:\Users\idea\Desktop\73socketTCP.py (top-level)
missing module named posix - imported by os (conditional, optional), C:\Users\idea\Desktop\73socketTCP.py (top-level)
missing module named _posixsubprocess - imported by subprocess (conditional), C:\Users\idea\Desktop\73socketTCP.py (top-level)
missing module named clr - imported by pyreadline.clipboard.ironpython_clipboard (top-level), pyreadline.console.ironpython_console (top-level), C:\Users\idea\Desktop\73socketTCP.py (top-level)
missing module named IronPythonConsole - imported by pyreadline.console.ironpython_console (top-level), C:\Users\idea\Desktop\73socketTCP.py (top-level)
missing module named StringIO - imported by pyreadline.py3k_compat (conditional), C:\Users\idea\Desktop\73socketTCP.py (top-level)
missing module named System - imported by pyreadline.clipboard.ironpython_clipboard (top-level), pyreadline.keysyms.ironpython_keysyms (top-level), pyreadline.console.ironpython_console (top-level), pyreadline.rlmain (conditional), C:\Users\idea\Desktop\73socketTCP.py (top-level)
missing module named sets - imported by pyreadline.keysyms.common (optional), C:\Users\idea\Desktop\73socketTCP.py (top-level)
missing module named startup - imported by pyreadline.keysyms.common (conditional), pyreadline.keysyms.keysyms (conditional), C:\Users\idea\Desktop\73socketTCP.py (top-level)
missing module named console - imported by pyreadline.console.ansi (conditional), C:\Users\idea\Desktop\73socketTCP.py (top-level)
excluded module named _frozen_importlib - imported by importlib (optional), importlib.abc (optional), C:\Users\idea\Desktop\73socketTCP.py (top-level)
missing module named _frozen_importlib_external - imported by importlib._bootstrap (delayed), importlib (optional), importlib.abc (optional), C:\Users\idea\Desktop\73socketTCP.py (top-level)
missing module named _winreg - imported by platform (delayed, optional), C:\Users\idea\Desktop\73socketTCP.py (top-level)
missing module named _scproxy - imported by urllib.request (conditional)
missing module named java - imported by platform (delayed), C:\Users\idea\Desktop\73socketTCP.py (top-level)
missing module named 'java.lang' - imported by platform (delayed, optional), C:\Users\idea\Desktop\73socketTCP.py (top-level), xml.sax._exceptions (conditional)
missing module named vms_lib - imported by platform (delayed, conditional, optional), C:\Users\idea\Desktop\73socketTCP.py (top-level)
missing module named termios - imported by tty (top-level), C:\Users\idea\Desktop\73socketTCP.py (top-level), getpass (optional)
missing module named grp - imported by shutil (optional), tarfile (optional), C:\Users\idea\Desktop\73socketTCP.py (top-level)
missing module named org - imported by pickle (optional), C:\Users\idea\Desktop\73socketTCP.py (top-level)
missing module named pwd - imported by posixpath (delayed, conditional), shutil (optional), tarfile (optional), http.server (delayed, optional), webbrowser (delayed), C:\Users\idea\Desktop\73socketTCP.py (top-level), netrc (delayed, conditional), getpass (delayed)
missing module named 'org.python' - imported by copy (optional), C:\Users\idea\Desktop\73socketTCP.py (top-level), xml.sax (delayed, conditional)

于是我试图寻找这些module在哪里,然而徒劳无功。事实上,即使打包成功的可以正常使用的,也会有类似内容。

百思不得其解,又在网上查询相关情况,结合本例实际,有如下怀疑:

1.参阅https://www.zhihu.com/question/53717334,导入的包的版本较高,pyinstaller不支持。

2.参阅https://www.jianshu.com/p/fe9ee823501c,pyinstaller找不到需要导入的包。

3.参阅https://www.cnblogs.com/nodchen/p/9672141.html,pyinstaller参数的问题。

我首先想到的是,先不导入任何包,用pyinstaller进行打包,试试看效果,再逐次导入包试着打包看看效果以便于定位到是哪个包导致的问题。

一次偶然,发现了问题所在,证实本例所遇到的问题如3的参阅一样,是参数的问题。

本例的关键,在于socket需要使用命令行,-w则是表明打包后不执行命令行。我的偶然即是打包的时候忘记了-w结果打包成功了。参阅https://blog.csdn.net/dugushangliang/article/details/100762354

若是其他情况,则逐步分析。我之前有导入pandas出现打包失败的问题。后续若有时间再行探究。

 

独孤尚良dugushangliang——著

 

<think>嗯,用户遇到了PyInstaller打包时出现Failed to execute script pyi_rth_pkgres的错误,我需要帮他们解决这个问题。首先,我得回顾一下之前提供的引用内容,看看有没有相关的解决方案。引用[1]提到,资源路径的问题,比如图片或字体使用绝对路径可能导致类似错误,但这里的具体错误是pyi_rth_pkgres,可能和包管理有关。引用[1]还提到了重新安装PyInstaller的develop版本,或者从官网下载。引用[2]则指出可能是PyQt5的环境变量设置问题,或者PyInstaller版本的问题,建议更换版本到3.2.1。而引用[3]和[4]提到了处理multiprocessing错误的补丁安装,这可能和系统有关,但不确定是否适用于当前问题。 首先,用户的问题是关于pyi_rth_pkgres的错误,这通常和Python的pkg_resources模块有关,可能在打包时某些依赖没有正确包含。根据引用[1],可能的解决方法包括更新PyInstaller到最新版本,特别是开发版,因为这个问题可能已经被修复。另外,用户可能需要检查他们的项目是否使用了某些需要隐式导入的包,比如setuptools或pkg_resources本身,这可能导致PyInstaller没有正确捕捉到依赖。 另外,引用[2]提到PyQt5的插件路径问题,但用户的问题是否涉及PyQt呢?如果用户的项目中使用了PyQt,可能需要设置环境变量或者检查插件路径。但如果没有使用PyQt,这可能不适用。不过,用户可能需要检查是否有其他GUI库或依赖导致类似问题。 接下来,我需要整理解决步骤。首先,建议用户升级PyInstaller到最新版本,特别是开发版,因为官方可能已修复该问题。然后,检查项目中的导入语句,确保所有依赖都被正确识别,可能需要添加隐藏导入。此外,检查资源路径是否正确,使用相对路径而非绝对路径。如果用户的环境有特定库如PyQt5,可能需要配置环境变量或更新相关库。最后,如果问题依旧,尝试清理构建缓存或使用纯净环境重新打包。 用户可能需要逐步尝试这些方法,从最简单的升级PyInstaller开始,然后逐步检查其他可能因素。需要确保回答结构清晰,分步骤说明,每个步骤给出具体的命令或操作,比如pip安装开发版,添加hidden imports的方法,设置环境变量等。同时,提醒用户注意项目中的资源路径和依赖管理,避免常见陷阱。 最后,生成相关问题,可能包括其他打包错误如何处理,如何优化PyInstaller打包体积,或者特定库打包时的注意事项。这有助于用户进一步解决问题或深入理解打包过程。</think>### PyInstaller打包出现"Failed to execute script pyi_rth_pkgres"解决方案 #### 1. 升级PyInstaller版本 该错误常见于旧版本PyInstaller,建议先更新至最新开发版: ```bash pip uninstall pyinstaller pip install https://github.com/pyinstaller/pyinstaller/archive/develop.zip ``` 此方法已修复多个运行时钩子相关的问题[^1][^2] #### 2. 添加隐藏导入 在.spec文件中添加缺失的包引用: ```python a = Analysis( ..., hiddenimports=['pkg_resources.py2_warn'], # 关键隐藏导入 hookspath=[], ... ) ``` 或通过命令行参数: ```bash pyinstaller --hidden-import pkg_resources.py2_warn your_script.py ``` #### 3. 检查资源路径(关键步骤) 若项目包含以下资源需特殊处理: - 字体文件:使用系统通用字体(如`Arial`) - 图片/音频:确保使用相对路径`os.path.join(os.path.dirname(__file__), "img.png")` - 数据文件:通过`--add-data`参数显式添加: ```bash pyinstaller --add-data "data/*;data" your_script.py ``` #### 4. 处理PyQt/Qt插件问题 若涉及GUI框架,设置环境变量: ```python import os os.environ["QT_PLUGIN_PATH"] = os.path.join(os.path.dirname(sys.executable), "PyQt5", "Qt", "plugins") ``` 或通过命令行添加插件路径: ```bash pyinstaller --paths "/path/to/PyQt5/Qt/plugins" your_script.py ``` #### 5. 完整清理构建环境 ```bash # 删除所有缓存文件 rm -rf build/ dist/ __pycache__/ # 使用纯净环境重新打包 pip install --force-reinstall -r requirements.txt ``` #### 6. Windows系统补丁(终极方案) 对于Windows 7系统,安装补丁KB2533623: ```powershell # 下载补丁后执行 expand -F:* C:\update\Windows6.1-KB2533623-x64.msu C:\update dism.exe /online /Add-Package /PackagePath:C:\update\Windows6.1-KB2533623-x64.cab ``` 建议优先升级到Windows 10系统[^3][^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值