Help us understand the problem. What is going on with this article?

PyCharm環境が壊れたと思ったらファイル名のせいだった話

はじめに

これはFatal Python errorが出てPyCharm環境が壊れたと思ったら.pyファイル名のせいだったという話です。
初心者あるあるだと思いたい。

環境

Windows10 + Anacondaでpython 3.7の仮想環境を作りPyCharmで実行
この組み合わせにたどり着くまでに幾度も苦難があったため、既にpythonに恐れを抱いている人間がこの記事を書いています。

エラー発生までの経緯

Python3エンジニア試験の勉強中に出てきたreprlibについて、動作確認しようと思い以下のコードを書いて.pyファイルを作成しました。

import reprlib
reprlib.repr(set('abcdefg'))

2行なので超気楽に実行するとまさかのエラー。。。

Fatal Python error: initsite: Failed to import the site module
Traceback (most recent call last):
  File "C:\XXXXXXXX\Anaconda3\envs\py37\lib\site.py", line 168, in addpackage
    exec(line)
# (中略)
  File "<プロジェクトフォルダ>\reprlib.py", line 2, in <module>
    reprlib.repr(set('abcdefg'))
AttributeError: module 'reprlib' has no attribute 'repr'

※エラーメッセージに既に答えが出ていますが、初心者は気付かないのが常です。

エラー解消までの流れ

今まで動いていたプログラムの確認

試験の例題通りのプログラムなのでプログラムのせいではない、と考え、前回PyCharmを使ってからの間で何か環境が変わってしまったのではないか、と予想しました。
そこでとりあえず今まで動いていたpythonプログラムが動くか確認しようと実行。

a = 100
b = 50
c = a + b
print(c)

ただの足し算ですが、

Fatal Python error: initsite: Failed to import the site module
# (中略)
  File "<プロジェクトフォルダ>\reprlib.py", line 2, in <module>
    reprlib.repr(set('abcdefg'))
AttributeError: module 'reprlib' has no attribute 'repr'

reprlibを使っていないのにさっきと全く同じエラーが発生。
⇒PyCharmがプログラムを読み込めていない…?

Google先生に聞いてみる

"Failed to import the site module"で検索すると、pythonのバージョンが異なるとかpathが間違ってるとかモジュール名が間違ってるとかが出てきました。
PyCharmがプログラムを読めていなさそうだということもあり、Anaconda Navigatorから以下を確認。
- Environmentsで仮想環境がActiveにできる
- ターミナルでpythonが打てる
- ターミナルでimport reprlibを打ってもエラーにならない
⇒Anacondaは問題なさそう。やはりPyCharmの設定がおかしくなった…?

PyCharm再インストール

自分の手で設定を変更した記憶はない、となるととりあえず再インストールを試すのが早いと判断。
PyCharmをアンインストール→再インストール後、再度足し算プログラムを実行。

Fatal Python error: initsite: Failed to import the site module
# (中略)
  File "<プロジェクトフォルダ>\reprlib.py", line 2, in <module>
    reprlib.repr(set('abcdefg'))
AttributeError: module 'reprlib' has no attribute 'repr'

な゛ん゛て゛か゛わ゛ら゛な゛い゛の゛

仮想環境作り直し

PyCharmと仮想環境の連結がおかしいのかも?と思ってやけくそで仮想環境を別名で作り直し→PyCharmからインタプリタを再設定し足し算プログラム実行。

Fatal Python error: initsite: Failed to import the site module
# (中略)
  File "<プロジェクトフォルダ>\reprlib.py", line 2, in <module>
    reprlib.repr(set('abcdefg'))
AttributeError: module 'reprlib' has no attribute 'repr'

そろそろ見飽きた。

キャッシュを疑う

PyCharmを再インストールしたものの、アンインストール時に消されていない何かがあるのでは??そういえば再インストールするときなんかConfig読みに行ってたし。と思いPyCharmのプロジェクトフォルダ内を確認。
すると__pycache__とかいう怪しいフォルダを発見!!
これだ!!

PyCharm再々インストール

__pycache__フォルダを削除し、本日2度目のPyCharm再インストール。
今度こそ綺麗な環境になったのできっと動くでしょう、と祈り、足し算プログラム実行。

150

Process finished with exit code 0

ほらねーー!!
そしてreprlibプログラム実行!!

Fatal Python error: initsite: Failed to import the site module
# (中略)
  File "<プロジェクトフォルダ>\reprlib.py", line 2, in <module>
    reprlib.repr(set('abcdefg'))
AttributeError: module 'reprlib' has no attribute 'repr'

神よ。。。

天啓を得る

まだ何かが残っているのは間違いないと思い、プロジェクトフォルダを再度確認すると、また__pycache__フォルダができていました。
そういえば何が入ってるんだろう、と思い中を確認。

reprlib.cpython-37.pyc

ん゛?

何が起こったのか

拡張子pycはpythonがコンパイルされたときに作成されるファイルです。
作成タイミング:
1. モジュールのインポート初回
2. モジュールのインポート2回目以降で、既にpycファイルが存在するが、pyファイルと比較しタイムスタンプが古い場合
参考:https://techacademy.jp/magazine/19131

エラーメッセージに出ていますが、今回import reprlibをする.pyファイル名をreprlib.pyとしていました。
これが実行されると、import対象モジュールと同名でプロジェクトフォルダの下に新しくreprlibがコンパイルされてしまうため、その新しい方をpythonが実行しにいってしまい、正しいreprlibを呼び出すことができなかったと思われます。(不具合のある自作モジュールを作ったと同義)
reprlibをimportしていない足し算プログラムも動かなかった理由についてはよく分かりません。。。推測ですが、プロジェクトフォルダ内の.pyc検索が.pyよりも先に実行されているのかも。

解決策

import reprlibをする.pyファイル名をreprlib.pyから別の適当な名前に変更したら、あっさり実行できました。
なお、通常の__pycache__はAnacondaの場合 ~\Anaconda3\envs\<仮想環境名>\Libの下にあります。自作モジュールを作っていないのにプロジェクトフォルダの下にある場合は疑った方がいいです。

教訓

  1. .pyファイル名は既存のモジュール名と別の名前にする。
  2. もう少しpythonについて調べてから動く。(pycacheが何か調べていればPyCharm再々インストールは不要だった)

お粗末様でした。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした