错误描述
windows 上 python 环境运行 mycli 出现报错 (linux 类似错误应该也有参考价值):
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa8 in position 52: invalid start byte
Traceback (most recent call last):
File "c:\users\laish\anaconda3\lib\runpy.py", line 194, in _run_module_as_main
return _run_code(code, main_globals, None,
File "c:\users\laish\anaconda3\lib\runpy.py", line 87, in _run_code
exec(code, run_globals)
File "C:\Users\laish\Anaconda3\Scripts\mycli.exe\__main__.py", line 7, in <module>
File "c:\users\laish\anaconda3\lib\site-packages\click\core.py", line 829, in __call__
return self.main(*args, **kwargs)
File "c:\users\laish\anaconda3\lib\site-packages\click\core.py", line 782, in main
rv = self.invoke(ctx)
File "c:\users\laish\anaconda3\lib\site-packages\click\core.py", line 1066, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "c:\users\laish\anaconda3\lib\site-packages\click\core.py", line 610, in invoke
return callback(*args, **kwargs)
File "c:\users\laish\anaconda3\lib\site-packages\mycli\main.py", line 1160, in cli
mycli = MyCli(prompt=prompt, logfile=logfile,
File "c:\users\laish\anaconda3\lib\site-packages\mycli\main.py", line 136, in __init__
c = self.config = read_config_files(config_files)
File "c:\users\laish\anaconda3\lib\site-packages\mycli\config.py", line 105, in read_config_files
_config = read_config_file(_file, list_values=list_values)
File "c:\users\laish\anaconda3\lib\site-packages\mycli\config.py", line 52, in read_config_file
config = ConfigObj(f, interpolation=False, encoding='utf8',
File "c:\users\laish\anaconda3\lib\site-packages\configobj.py", line 1229, in __init__
File "c:\users\laish\anaconda3\lib\site-packages\configobj.py", line 1287, in _load
content = self._handle_bom(content)
File "c:\users\laish\anaconda3\lib\site-packages\configobj.py", line 1437, in _handle_bom
return self._decode(infile, self.encoding)
File "c:\users\laish\anaconda3\lib\site-packages\configobj.py", line 1517, in _decode
infile[i] = line.decode(encoding)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa8 in position 52: invalid start byte
错误分析
找到 configobj.py 的对应出错位置:
if encoding:
for i, line in enumerate(infile):
if isinstance(line, six.binary_type):
# NOTE: The isinstance test here handles mixed lists of unicode/string
# NOTE: But the decode will break on any non-string values
# NOTE: Or could raise a ``UnicodeDecodeError``
infile[i] = line.decode(encoding)
可以看到这里本身就有一个注释,要求不得有非unicode码的字符串。 报错信息说 ‘utf-8’ codec can’t decode byte 0xa8 in position 52: invalid start byte,因此我在此直接补上了一个 print(line[:60]),看看 52 个字符到底除了什么问题。
if encoding:
for i, line in enumerate(infile):
if isinstance(line, six.binary_type):
print(line[:60]) # add this to check
# NOTE: The isinstance test here handles mixed lists of unicode/string
# NOTE: But the decode will break on any non-string values
# NOTE: Or could raise a ``UnicodeDecodeError``
infile[i] = line.decode(encoding)
再次运行 mycli,打印了对应的 line:
可以看到在 “military time”后面出现了一些\xa8c的 unicode解析不了的字符。根据打印出的内容,推测这些字符串来源于 .myclirc 配置文件(按经验,好多软件都有个类似的 .xxrc 配置文件)。在用户家目录下找到这个 .myclirc 文件(不要和site_package里的 .myclirc 搞混了,那个是原型,家目录下的是本地配置的副本)。
确实找到了这一行:
文中 0-23之间的 - 是一个我怎么也打不出来的字符,我只能复制。看来问题出在这了。
因为这里本身就是一个注释,因此怎么改也没关系,改掉应该就成了。
解决方案
- 到当前用户家目录下(windows是 C:\Users<username>,linux 应该就是 /home/)打开
.myclirc文件(这是隐藏文件所以得设置一下文件显示设置才看得到) - 修改以下两行,把行尾的 “-” (我也打不出来)都改成正常的 -(用英文输入法)。
# \R - The current time, in 24-hour military time (0-23)
# \r - The current time, standard 12-hour time (1-12)
- 再次在 python 环境下运行 mycli,成了。

学会了,以后报错直接 debug 源码!(?
版权声明:本文为banerye原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。