В моем коде есть несколько китайских комментариев. Отладчик 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. Я не знаю, что здесь происходит.