在終端啟動Python時報錯的解決


最近,在終端啟動Python時,報了一個錯誤:

  1 Failed calling sys.__interactivehook__
  2 Traceback (most recent call last):
  3   File "d:\ProgramData\Anaconda3\lib\site.py", line 439, in register_readline
  4     readline.read_history_file(history)
  5   File "d:\ProgramData\Anaconda3\lib\site-packages\pyreadline\rlmain.py", line 165, in read_history_file
  6     self.mode._history.read_history_file(filename)
  7   File "d:\ProgramData\Anaconda3\lib\site-packages\pyreadline\lineeditor\history.py", line 82, in read_history_file
  8     for line in open(filename, 'r'):
  9 UnicodeDecodeError: 'gbk' codec can't decode byte 0xa7 in position 2167: illegal multibyte sequence

原因是Python的終端歷史文件中包含中文,但不能正確使用gbk解碼。查看了Python歷史文件(系統用戶目錄下的.python_history),其編碼方式為“utf-8”,而”history.py”中讀取歷史文件時使用的編碼方式為“gbk”,所以會報錯。

 

解決方法

在history.py中使用`for line in open(filename, 'r')`來打開文件並讀取每一行,使用的是默認的編碼方式。需要根據不同文件的編碼方式傳入相應的參數值。

1. 首先檢測出要打開的文件的編碼方式。

在類中定義一個私有方法_get_encoding,作用是檢測文件的編碼方式,並返回。(需要導入chardet包)

  1     def _get_encoding(self, filename=None):
  2     	if filename is None:
  3     		return
  4 
  5     	with open(filename, 'rb') as f:
  6     		return chardet.detect(f.read())['encoding']

2. 修改歷史文件內容的讀取

  1             
encoding = self._get_encoding(filename)
  2             
for line in open(filename, 'r', encoding=encoding):
  3                 self.add_history(lineobj.ReadLineTextBuffer(ensure_unicode(line.rstrip())))
  4 

OK。問題解決。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM