操作背景
操作系统:Windows 7 中文家庭版 64 位
Python 版本:Python 3.6.8rc1
报错详情
我使用又拍云 API 和 Python 写了一个程序,该程序需要用到又拍云的 Python 模块 upyun
. 但是,今天我将该程序复制到另一个文件夹下后,再运行却报错:
AttributeError: module 'upyun' has no attribute 'UpYun'
报错截图如图 1 所示:
解决过程
由于我之前已经在这台机器上导入了又拍云的 upyun
模块,而报错说 “upyun 模块没有 UpYun 属性”。于是,我先尝试卸载并重新安装 upyun
模块:
pip3 uninstall upyun pip3 install upyun
但是,这并未能解决上述问题,前述报错依然存在。
随后,我检查了产生报错的程序本身,该程序文件名是:
postsun.py
这个文件名称与报错中显示的 upyun 模块的名称并不冲突。但在 postsun.py
的同级目录下还有一个名称为 upyun.py
的文件,该文件的文件名与 upyun
模块的名称重复。
随后,我将 postsun.py
移动到一个单独的文件夹后,postsun.py
可以正常运行,不再有报错提示。
至此,问题解决。
总结
根据我在测试环境中得到的测试结果,在运行 Python3 代码(Python2 可能也类似,但是我没有进行实际测试)时,若要运行的程序的文件名与其中导入的 Python 模块的名称相同或者要运行的程序的同级目录下含有和要运行的程序中导入的 Python 模块的名称相同的 .py
格式的文件,则就会产生前述报错,例如图 2:
在图 2 所示的环境中,由于我在 postsun.py
中使用 import upyun
导入了 upyun
模块,而 postsun.py
的同级目录下有一个 .py
格式的同名文件 upyun.py
, 因此,运行 postsun.py
会报错:
AttributeError: module 'upyun' has no attribute 'UpYun'
而如果把 upyun.py
改成其他后缀,保持文件名等其他环境不变,例如图 3:
此时运行 postsun.py
就不会产生报错。
EOF