0
0

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 1 year has passed since last update.

Pythonのimportとハマるファイル名の話

Last updated at Posted at 2022-07-22

はじめに

以前「Pythonのimport方法まとめ」という記事も書きましたが、PHPを使ってきたエンジニアには Python の import はなかなか難しい。今回はそんな import にハマったお話し。

エラーが発生

ディレクトリ構成は以下のとおり。

test/
  ┣━ __init__.py
  ┗━ redis.py

redis.py の内容は以下のとおり。

redis.py
import redis

if __name__ == "__main__":
  r = redis.Redis(host="localhost", port=6379, db=0)
  r.set("key1", "value1")
  print(r.get("key1").decode())

redis.py を実行すると、redis には Redis というアトリビュートはないよ、と怒られる。いや、あるんですよ。Redis というクラスが。redisパッケージのソースを読みましたが、確実にあります。

$ python3 redis.py 
Traceback (most recent call last):
  File "/path/to/test/redis.py", line 4, in <module>
    r = redis.Redis(host="localhost", port=6379, db=0)
AttributeError: module 'redis' has no attribute 'Redis'. Did you mean: 'redis'?

原因がわかった

あれやこれやと半日くらい悩んだ結果、redis.py というファイル名とimportしようとしたパッケージ名がかち合っていることにに気が付きました。1行目の import はredisパッケージではなく自分自身(redis.py)を呼び出していたのです。ファイル名を redis_test.py に変えたら期待通りに動きました。
ファイル名がモジュール名として認識される Python の仕様は、扱うのに慣れが必要だと思います。

0
0
0

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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?