python启动时Failed calling sys.__interactivehook__错误原因及解决方法

本文分析了Python启动时报错UnicodeDecodeError的原因,通常源于python_history文件中的中文字符编码问题。提供两种解决方案,一是手动删除历史文件中的中文记录,二是修改history.py源码支持UTF-8编码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

启动python时,突然遇到以下错误,报错描述

C:\Users\starxhong>python
Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51) [MSC v.1914 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
Failed calling sys.__interactivehook__
Traceback (most recent call last):
File "C:\Python\Python37\lib\site.py", line 439, in register_readline
readline.read_history_file(history)
File "C:\Python\Python37\lib\site-packages\pyreadline\rlmain.py", line 165, in read_history_file
self.mode._history.read_history_file(filename)
File "C:\Python\Python37\lib\site-packages\pyreadline\lineeditor\history.py", line 82, in read_history_file
for line in open(filename, 'r'):
UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 247: illegal multibyte sequence
>>>

分析过程

分析发现,最后报错的位置是C:\Python\Python37\lib\site-packages\pyreadline\lineeditor\history.py的82行,报错类型时UnicodeDecodeError。python中编码错误是比较常见的错误类型,常见的一个错误来源就是中文字符的编码问题,我之前也做过一些总结,有兴趣更细致了解的可以参考:
Python 编码问题——UnicodeDecodeError(一)
Python 编码问题——UnicodeDecodeError(二)
顺藤摸瓜,可以找到问题发生的源头在C:\Python\Python37\lib\site.py,直接打开看注释,你会知道这个模块有三个主要功能:

  • 将site-packages里的第三方库加入系统路径,保证你安装的第三方库可以用import命令找到;
  • 引入readline库来实现tab键的自动补全功能,我们之前使用过的python命令都会被存入python_history文件中,readline模块会读取这个文件,来帮助系统做自动补全(类似输入法记录了你曾经输入的词语,然后下次输入就能自动提示);
  • 至于第3个功能,引入sitecustomize模块,用于一些本地化配置(比如python文件编码格式),但这个不是必须的,没有加载成功也不会报错。

那么,问题显而易见了:
你曾经某次输入python命令打错成中文,写进了python_history文件,而readline模块的history.py设计的时候就没想过会遇到中文,所以就出现上面的问题,所以要么你把python_history文件中那行中文记录删掉,要么你去改history.py源码加入中文编码。


解决方案

以下方案任选其一,推荐方案2,终身解决:

  1. 找到python_history文件,将其中的中文记录删除。在我这,该文件存在于C:\Users\starxhong\python_history;
  2. 打开C:\Python\Python37\lib\site-packages\pyreadline\lineeditor\history.py,修改第82行增加utf-8编码:
for line in open(filename, 'r', encoding='utf-8'):
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值