PyInstaller打包后运行报错:bad marshal data (unknown type code)
PyInstaller打包后marshal数据错误及重复执行rth脚本问题解决
错误本质分析
Failed to unmarshal code object for conv ValueError: bad marshal data (unknown type code):marshal是Python序列化代码对象的核心机制,这个错误说明conv.py对应的字节码或打包时嵌入的代码数据已损坏,可能是打包缓存残留、32位环境兼容性问题,或是.spec配置错误导致模块重复打包。- 重复执行
pyi_rth_*.py脚本:通常是.spec文件中重复配置了runtime hooks(运行时钩子),或是PyInstaller在32位环境下的打包逻辑异常,导致初始化流程被多次触发。
具体解决步骤
清理打包残留文件
删除build、dist目录以及所有__pycache__文件夹,避免损坏的缓存文件干扰重新打包:# Windows rd /s /q build dist __pycache__ # Linux/macOS rm -r build dist __pycache__检查并修正.spec文件
查看.spec中的datas、hiddenimports、runtime_hooks字段,确保没有重复添加conv.py或相关依赖,也没有重复引用同一rthook脚本。如果是基于自动生成的.spec修改的,对比默认生成的版本,移除多余的配置项。修复
conv.py的字节码问题
删除conv.py对应的.pyc文件(位于__pycache__目录),重新生成干净的字节码后再执行打包操作。同时确认conv.py本身没有语法错误,也未使用过不兼容marshal机制的第三方字节码处理工具。调整打包参数
- 先跳过自定义.spec,直接用命令行打包测试,排查.spec配置问题:
pyinstaller --console --debug=all your_main_script.py - 针对32位环境,禁用UPX压缩(UPX可能损坏32位代码对象):
pyinstaller --console --noupx your_spec_file.spec
- 先跳过自定义.spec,直接用命令行打包测试,排查.spec配置问题:
验证版本兼容性
确认Python 3.8 32bit与PyInstaller 5.13的兼容性,可尝试降级PyInstaller至5.10版本,或升级Python 3.8到最新小版本(如3.8.10),避免版本间的边缘适配问题。
内容的提问来源于stack exchange,提问作者Dmitry Bogomaz
相关产品推荐
相关产品推荐

