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将文件名作为模块名识别的规范需要一些熟悉和适应的过程。

广告
将在 10 秒后关闭
bannerAds