19

この記事は最終更新日から1年以上が経過しています。

投稿日

更新日

Pythonでファイル名が悪くてimportでハマった

ライブラリをちょっと試そうとして、import したいモジュールと同じ名前を付けてハマりました。常識なのかもしれませんが、知らなかったのでメモしておきます。

エラー

math モジュールを試したくて、math.py というファイルを書いたとします。

math.py
import math
print(math.pi)

これを実行するとエラーになります。

実行結果
$ python math.py
Traceback (most recent call last):
  File "math.py", line 1, in <module>
    import math
  File "/home/xxxx/math.py", line 2, in <module>
    print(math.pi)
AttributeError: partially initialized module 'math' has no attribute 'pi' (most likely due to a circular import)

自分自身を循環参照

原因はエラーに書いてあるように自分自身を import して循環してしまったことです。

(most likely due to a circular import)

すぐには分からなかったので、適当に print を入れたりしてみました。

math.py
print("math")
import math
print(math.pi)
実行結果
$ python math.py
math
math
Traceback (most recent call last):
  File "math.py", line 2, in <module>
    import math
  File "/home/xxxx/math.py", line 3, in <module>
    print(math.pi)
AttributeError: partially initialized module 'math' has no attribute 'pi' (most likely due to a circular import)

math が2回表示されています。これでようやく、自分自身を参照していることが分かりました。

同じファイルの2回目の import は無視されるので先に進んで、math.pi がないことからエラーになります。

結論

ファイル名を変えれば動きます。import の対象と同じファイル名は避けましょう。

新規登録して、もっと便利にQiitaを使ってみよう

  1. あなたにマッチした記事をお届けします
  2. 便利な情報をあとで効率的に読み返せます
ログインすると使える機能について
7shi
この記事は以下の記事からリンクされています

コメント

同じ内容で引っ掛かりましたが、この記事を読んで解決しました。ありがとうございました。

1

お~、なるほどありがたいです!

1

同じ内容で引っかかっていました.助かりました.ありがとうございました.

1
あなたもコメントしてみませんか :)
新規登録
すでにアカウントを持っている方はログイン
19