56
22

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-04-30

ライブラリをちょっと試そうとして、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 の対象と同じファイル名は避けましょう。

56
22
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
56
22

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?