AttributeError: '模块'对象没有属性'[x]
我正在尝试写一个脚本,把桌面上的所有 .txt 文件移动到桌面/org 文件夹,代码如下:
import os
import shutil
userhome = os.path.expanduser('~')
src = userhome + '/Desktop/'
dst = src+ 'org/'
def main():
txtlist = os.listdir(src)
for file in txtlist:
sortFiles(file)
def sortFiles(file):
if file.endswith(".txt"):
shutil.move(src+file,dst)
main()
但是当我直接运行这个 .py 文件时,出现了一个错误:AttributeError: 'module' object has no attribute 'copy'。不过,如果我把最后一行 "main()" 删除掉,然后在 Python 命令行中把这个脚本当作模块导入,并从那里调用 .main(),那就能正常工作。请问我该如何让它 作为一个脚本 正常运行呢?
Traceback (most recent call last):
File "C:\Python32\org.py", line 3, in <module>
import shutil
File "C:\Python32\lib\shutil.py", line 14, in <module>
import tarfile
File "C:\Python32\lib\tarfile.py", line 50, in <module>
import copy
File "C:\Python32\lib\copy.py", line 61, in <module>
from org.python.core import PyStringMap
File "C:\Python32\org.py", line 19, in <module>
main()
File "C:\Python32\org.py", line 12, in main
sortFiles(file)
File "C:\Python32\org.py", line 16, in sortFiles
shutil.move(src+file,dst)
AttributeError: 'module' object has no attribute 'move'
我使用的是 Python 3.2
1 个回答
哇,真是倒霉。我们可以通过查看错误信息来理解发生了什么:
Traceback (most recent call last):
File "C:\Python32\org.py", line 3, in <module>
import shutil
首先执行的代码是 import shutil
。从这里开始,一切就出问题了——这让人意外,因为这个是内置模块。
File "C:\Python32\lib\shutil.py", line 14, in <module>
import tarfile
File "C:\Python32\lib\tarfile.py", line 50, in <module
import copy
接着,shutil
会去引入 tarfile
,而 tarfile
又会引入 copy
。
File "C:\Python32\lib\copy.py", line 61, in <module>
from org.python.core import PyStringMap
而 copy
有个很不错的功能,它尝试从一个叫 org.python.core
的模块中引入 PyStringMap
。通常情况下,这个模块是不存在的,这样 copy
就会使用一些备用代码:PyStringMap = None
。
问题是,实际上有一个叫 org
的东西:就是你自己的脚本 org.py
。所以发生的事情是,Python 尝试在你的 org.py
中找到 python.core.PyStringMap
。为了做到这一点,它需要先 执行 这个脚本,包括最后的 main()
调用:
File "C:\Python32\org.py", line 19, in <module>
main()
File "C:\Python32\org.py", line 12, in main
sortFiles(file)
File "C:\Python32\org.py", line 16, in sortFiles
shutil.copy(src+file,dst)
AttributeError: 'module' object has no attribute 'copy'
这就引出了 shutil.copy
这一行,它是对 shutil
模块的调用。因为我们还在导入这个模块(从第一行开始!),所以它的导入还没有完全结束,因此里面的 copy
函数并不存在,这就导致了 AttributeError
。
这是一个非常不幸的情况,因为你脚本的命名导致了一个循环导入,而这个导入的东西并不存在。
你可以很简单地通过把你的脚本改个名字来解决这个问题。