Как исправить ошибку «кодек gbk не может декодировать байт» в инструменте python pdb? - PullRequest
0 голосов
/ 21 мая 2019

В моем коде есть несколько китайских комментариев. Отладчик pdb вызовет UnicodeDecodeError только тогда, когда появятся некоторые конкретные символы.

Вот исходный файл util.py:

"""代码清单 util.py"""
import json

def load_info(path):
    """读取json文件"""
    with open(path) as f:
        return json.load(f)

def print_info(info):
    """打印信息"""
    for k, v in info.items():
        print('{}: {}'.format(k, v))

def to_upper(info):
    """将键值中的字符串转为大写"""
    for k, v in info.items():
        if isinstance(v, str):
            info[k] = v.upper()
    return info

И вот сообщение об ошибке при попытке добавить точку останова:

E:\10-写作\01-技术\01-Python\Python代码调试全面介绍\src
λ python -m pdb util.py
> e:\10-写作\01-技术\01-python\python代码调试全面介绍\src\util.py(1)<module>()
-> """代码清单 util.py"""
(Pdb) b print_info
Traceback (most recent call last):
  File "D:\Python37\lib\pdb.py", line 648, in do_break
    lineno = int(arg)
ValueError: invalid literal for int() with base 10: 'print_info'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "D:\Python37\lib\pdb.py", line 659, in do_break
    code = func.__code__
AttributeError: 'str' object has no attribute '__code__'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "D:\Python37\lib\pdb.py", line 1701, in main
    pdb._runscript(mainpyfile)
  File "D:\Python37\lib\pdb.py", line 1570, in _runscript
    self.run(statement)
  File "D:\Python37\lib\bdb.py", line 585, in run
    exec(cmd, globals, locals)
  File "<string>", line 1, in <module>
  File "e:\10-写作\01-技术\01-python\python代码调试全面介绍\src\util.py", line 1, in <module>
    """代码清单 util.py"""
  File "e:\10-写作\01-技术\01-python\python代码调试全面介绍\src\util.py", line 1, in <module>
    """代码清单 util.py"""
  File "D:\Python37\lib\bdb.py", line 88, in trace_dispatch
    return self.dispatch_line(frame)
  File "D:\Python37\lib\bdb.py", line 112, in dispatch_line
    self.user_line(frame)
  File "D:\Python37\lib\pdb.py", line 261, in user_line
    self.interaction(frame, None)
  File "D:\Python37\lib\pdb.py", line 352, in interaction
    self._cmdloop()
  File "D:\Python37\lib\pdb.py", line 321, in _cmdloop
    self.cmdloop()
  File "D:\Python37\lib\cmd.py", line 138, in cmdloop
    stop = self.onecmd(line)
  File "D:\Python37\lib\pdb.py", line 418, in onecmd
    return cmd.Cmd.onecmd(self, line)
  File "D:\Python37\lib\cmd.py", line 217, in onecmd
    return func(arg)
  File "D:\Python37\lib\pdb.py", line 667, in do_break
    (ok, filename, ln) = self.lineinfo(arg)
  File "D:\Python37\lib\pdb.py", line 740, in lineinfo
    answer = find_function(item, fname)
  File "D:\Python37\lib\pdb.py", line 100, in find_function
    for lineno, line in enumerate(fp, start=1):
UnicodeDecodeError: 'gbk' codec can't decode byte 0xac in position 329: illegal multibyte sequence
Uncaught exception. Entering post mortem debugging
Running 'cont' or 'step' will restart the program
> d:\python37\lib\pdb.py(100)find_function()
-> for lineno, line in enumerate(fp, start=1):
(Pdb)

Но когда я удалю некоторые китайские иероглифы, ошибок не будет. Я удалил некоторые комментарии для функции to_upper:

def to_upper(info):
    """将键值中"""
    for k, v in info.items():
        if isinstance(v, str):
            info[k] = v.upper()
    return info

Тогда ошибка просто исчезла:

(Pdb) b print_info
Breakpoint 2 at e:\10-写作\01-技术\01-python\python代码调试全面介绍\src\util.py:11

Исходный файл кодируется в формате UTF-8. Я не знаю, что здесь происходит.

...