在MacOS El Capitan上用PyInstaller编译Python应用时出现签名错误
解决MacOS El Capitan下PyInstaller打包的codesign签名移除错误
问题背景
为保证Python应用向前兼容,在MacOS El Capitan系统使用PyInstaller编译打包时出现错误,相同代码在Ventura和Catalina系统可正常编译。报错核心信息为:
SystemError: codesign command (['codesign', '--remove', '--all-architectures', '/Users/h/Desktop/BeansQR/BeansQR3.2/BeansQR 3.2']) failed with error code 1! output: /Users/h/Desktop/BeansQR/BeansQR3.2/BeansQR 3.2: invalid or unsupported format for signature
原因分析
El Capitan系统自带的codesign工具版本过旧,不支持--all-architectures参数——该参数是在后续MacOS版本中才引入的。而新版PyInstaller默认会添加这个参数,导致在旧系统上执行失败。
解决方案
方案1:修改PyInstaller的osx.py文件
- 定位到PyInstaller的工具文件路径:
/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/PyInstaller/utils/osx.py - 找到
remove_signature_from_binary函数,删除构造cmd_args代码中的'--all-architectures'参数 - 保存文件后重新执行PyInstaller打包命令
方案2:在spec文件中禁用签名处理
- 打开项目的
.spec文件,找到EXE()定义部分 - 添加
codesign_identity=None参数,示例:exe = EXE( pyz, a.scripts, a.binaries, a.zipfiles, a.datas, [], name='BeansQR 3.2', debug=False, bootloader_ignore_signals=False, strip=False, upx=True, upx_exclude=[], runtime_tmpdir=None, console=False, codesign_identity=None, # 添加此行禁用签名处理 disable_windowed_traceback=False, target_arch=None, codesign_all_architectures=False, entitlements_file=None ) - 保存后使用该spec文件重新打包
方案3:手动执行签名移除命令
打包报错后,手动执行不带--all-architectures的签名移除命令:
codesign --remove /Users/h/Desktop/BeansQR/BeansQR3.2/BeansQR 3.2
随后重新执行PyInstaller打包命令,可添加--noconfirm参数避免重新构建
内容的提问来源于stack exchange,提问作者Smartie
相关产品推荐
相关产品推荐

