Anaconda3 Python実行時にエラーが出始めました。

今日も見に来て下さって、ありがとうございます。

Anaconda3ディストリビューションのpythonを使っていると、なぜか起動時にエラーが出るようになってしまいました。

(base) C:\work>python
Python 3.7.3 (default, Mar 27 2019, 17:13:21) [MSC v.1915 64 bit (AMD64)] :: Anaconda, Inc. on win32
Type "help", "copyright", "credits" or "license" for more information.
Failed calling sys.__interactivehook__
Traceback (most recent call last):
  File "C:\ProgramData\Anaconda3\lib\site.py", line 439, in register_readline
    readline.read_history_file(history)
  File "C:\ProgramData\Anaconda3\lib\site-packages\pyreadline\rlmain.py", line 165, in read_history_file
    self.mode._history.read_history_file(filename)
  File "C:\ProgramData\Anaconda3\lib\site-packages\pyreadline\lineeditor\history.py", line 82, in read_history_file
    for line in open(filename, 'r'):
UnicodeDecodeError: 'cp932' codec can't decode byte 0xef in position 1549: illegal multibyte sequence
>>> 

エラーはUnicodeDecodeErrorということで、'cp932'(Windowsのデフォルトで概ねShift JISのコードのことです)に変換しようとがんばってみたんだけど、できなかったよ~、ごめんね、という意味です。何にもしていないはずの起動時にどうして出るのでしょうね。エラーメッセージに「history.py」とありますので、きっとインタプリタの履歴の中に変換できない文字コードが使われているということでしょう。エラーになっても実行できますが、履歴は保存されないので不便です。ちなみに、履歴は「C:\Users\username\.python_history」というファイルの中に格納されていました。中身を確認すると、ありました「髮サ隧ア逡ェ蜿キ = 10」というよくわからない行が。UTF-8→SJISに変換してみると「電話番号 = 10」という行になりました。確かに、なんかそんなことを実行した気がする。電話番号(笑)を保存してpythonを実行し直したところ、スムーズに開始しました。ただ、再度終了して起動したところ同様のエラーが出始めます。日本語の行を履歴ファイルからすべて削除すれば出なくなりますが、もっと根本的に解決したいですね。

そこで、histroy.pyファイルをよく読んでみました。どうやら、保存するときに文字列はちゃんとUnicodeになるようにしておいて、バイナリファイルとして保存するようにしているけど、開くときはデフォルトのテキストファイルとして読み込んでおり、デフォルトのエンコーディングが'cp932'になっているのが原因のようです。そこで、このファイルの中のread_history_file関数のファイルを開くところにencodingにutf8を指定するように変更してみます。そう、ちょうどエラーが発生しているhistory.pyファイルの82行目です。

【修正前】
            for line in open(filename, 'r'):
【修正後】
            for line in open(filename, 'r', encoding='utf8'):

はい、うまいこと動くようになりました。これで解決ですね!
ちなみにぼくの環境ではこのhistory.pyファイルは書き込み不可になっているものもありました。その場合は、ファイルのプロパティからセキュリティタブを選んでアクセス許可を編集して書き込みを許可すれば編集できます。

でも、なんでテキストで書いて、バイナリで読んでるのかなぁ。せっかくUnicodeを保証してるのに、最初からUnicodeで読んでほしいですよね。ソースファイル調べてみると、GitHubに登録されていました。issueにも同じエラーについて登録されていました。最近gitを使い始めたので、ちょっと修正依頼をお願いしてみましょう。フォークして、編集をして、プルリクエスト、終了。これであってるかな。ま、たぶん大丈夫でしょう。みんな初心者には優しいはずだし。リクエストが受け付けられるのを待ちましょう。あ、、、別のissueでもnone-latin charで同じようなエラーが出ていて、そちらも同様の修正でプルリクエストがでてる、というのを見つけちゃいました。結構プルリクエストは放置されているようですねぇ。。。ま、いっか。

“Anaconda3 Python実行時にエラーが出始めました。” への6件の返信

  1. 同じエラーメッセージが出て、このページ通りに作業してみたらエラーメッセージが出なくなりました!
    ほかのサイトでは対症療法的なことしか書いてなかったので、とても助かりました!この記事を書いて下さりありがとうございますm(_ _)m

  2. Unicode Decode Error:’cp932′ codec can’t decode byte oxef in position 28: illegal multibyte sequence  pythonを起動するというエラーが最初に必ず出ます。初心者ですので、理解ができません。どのようにすれば回避できるでしょうか?よろしくお願いを申し上げます。Anaconda prompt(anaconda3)で学習しています。

    1. 簡単に解決したいということでしたら、
      「.python_history」というファイルを検索してそれを削除してください。
      もし原因が同じ問題であれば、これで解決すると思います。

  3. すなわち “C:\ProgramData\Anaconda3\lib\site-packages\pyreadline\lineeditor\history.py”の
    82行目のfor文のところを修正すればいいんですね。
    直りました!!ありがとうございます!!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です