py2app打包Mac.app遇SyntaxError: Non-UTF-8编码问题求助
我之前也碰到过类似的情况——脚本本身跑起来没问题,转成普通可执行文件也正常,唯独打包成.app就报编码错。不用逐行翻800行脚本,试试这些高效定位方法:
用终端工具快速扫描非UTF-8字符
直接在终端跑这条命令,它会自动标出所有包含非ASCII字符的行和行号,省去手动排查的麻烦:grep -n --color='auto' -P "[^\x00-\x7F]" your_script.py也可以先确认脚本本身的编码是否真的是UTF-8:
file -I your_script.py如果输出不是
text/plain; charset=utf-8,说明脚本编码确实存在问题,需要重新保存为标准UTF-8。检查打包后的.app入口文件
错误提示明确指向py2app/dist/myapp.app/Contents/MacOS/myapp的第一行,直接查看这个文件的隐藏字符:cat -v py2app/dist/myapp.app/Contents/MacOS/myapp | head -2有时候py2app在打包过程中会篡改shebang行或添加隐形特殊字符,用
cat -v能把这些不可见字符显示出来,一眼就能发现问题。强制脚本保存为无BOM的UTF-8
从Excel复制文本很容易带入隐形的BOM或特殊编码字符,哪怕在线工具检测不出来。用VS Code或Sublime打开脚本,右下角切换编码为UTF-8(注意不要选UTF-8 with BOM),重新保存后再打包试试。调整py2app的打包配置
在setup.py里给py2app指定编码参数,确保打包过程全程用UTF-8处理脚本:from setuptools import setup APP = ['your_script.py'] OPTIONS = { 'argv_emulation': True, 'encoding': 'utf-8' } setup( app=APP, options={'py2app': OPTIONS}, setup_requires=['py2app'], )之后用
python setup.py py2app重新打包,大概率能解决编码冲突问题。
你提到转成可执行文件没问题,说明脚本逻辑本身是正常的,问题基本出在py2app打包时的编码处理环节,按上面的方法一步步排查,应该能快速定位到根源。
内容的提问来源于stack exchange,提问作者DDiran

