AttributeError: '模块'对象没有属性'[x]

6 投票
1 回答
12274 浏览
提问于 2025-04-17 20:31

我正在尝试写一个脚本,把桌面上的所有 .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 个回答

16

哇,真是倒霉。我们可以通过查看错误信息来理解发生了什么:

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

这是一个非常不幸的情况,因为你脚本的命名导致了一个循环导入,而这个导入的东西并不存在。

你可以很简单地通过把你的脚本改个名字来解决这个问题。

撰写回答