はじめに
以前「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 の仕様は、扱うのに慣れが必要だと思います。