Python的import和陷入困境的文件名的故事
首先
之前我写过一篇名为“Python的导入方法总结”的文章,但对于使用PHP的工程师来说,Python的导入方式是相当困难的。这一次我想分享一下我遇到的导入问题。
发生了错误
目录结构如下。
test/
┣━ __init__.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语句是调用了我自己的redis.py文件,而不是redis包。当我将文件名改为redis_test.py后,它按照我的期望运行了起来。
我认为,Python将文件名作为模块名识别的规范需要一些熟悉和适应的过程。