Python编译后部分设备报Non-UTF-8无编码声明错误求解
报错原因解答
报错原文:文件<>第5行存在以'\x83'开头的非UTF-8代码,且未声明编码格式。
导致该问题的核心原因有三点:
- pyc文件版本不兼容:pyc是CPython解释器专属的字节码文件,和编译时使用的Python小版本、操作系统架构强绑定。你用
python -OO -m py_compile编译时使用的Python版本和报错用户的本地Python版本不一致时,解释器解析pyc中嵌入的字符元数据时会出现编码逻辑偏差,进而触发编码报错。能正常运行的朋友的Python版本和你编译时的版本完全一致,所以不会触发该问题。 - 系统默认编码差异:你编写源码时没有在文件首行添加编码声明
# -*- coding: utf-8 -*-,Python加载无编码声明的文件时会自动使用当前系统的默认编码做解析。你代码中tqdm设置了ascii=False,运行时会输出Unicode编码的进度条符号,这类字符在默认编码为UTF-8的系统(如MacOS、Linux、配置了UTF-8默认编码的Windows)上可以正常解析,而在简体中文Windows系统上默认编码为GBK/CP936,解析UTF-8字符时就会识别到\x83这类GBK编码中不存在的非法开头字节,触发报错。 - 反编译的干扰:你将pyc反编译为py文件时,反编译工具会自动将字节码中的字符转译为UTF-8编码的内容,所以你在反编译得到的py文件中看不到原始编码问题,不代表编译前的原文件不存在编码声明缺失的情况。
修复方案
如果要让编译后的pyc可以在更多设备上正常运行,可以做如下修改:
- 在原py文件的第一行添加编码声明:
# -*- coding: utf-8 -*- - 将
tqdm的ascii参数改为ascii=True,避免输出非ASCII的进度条符号 - 明确告知运行的朋友需要使用和你编译时完全相同的Python小版本运行pyc文件,或者直接分发py源代码文件而非pyc文件。
内容的提问来源于stack exchange,提问作者I_like_ Usernames_
相关产品推荐
相关产品推荐

