【问题标题】:AttributeError: 'module' object has no attribute '[x]'AttributeError:“模块”对象没有属性“[x]”
【发布时间】:2014-11-11 21:10:42
【问题描述】:

我正在尝试制作一个脚本,将您桌面中的所有 .txt 文件移动到 desktop/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

【问题讨论】:

  • 你能发布错误的完整堆栈跟踪吗?
  • 这段代码在我的 Mac 上的 Python 2.7 下运行良好。我想你从你的其他程序中调用main(),因为没有.move()
  • 这对我来说在 CentOS 中工作得很好,只要你有现有的目录!
  • 对不起,我想说.main()。我已经在帖子上编辑了。我还添加了回溯。我正在使用 python 3.2 顺便说一句
  • 目录确实存在。如果我将此脚本作为模块导入并从命令行调用它的 .main() ,它对我来说效果很好。问题是我不能让它作为一个自动执行的脚本工作。

标签: python


【解决方案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,它导入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

这是一种非常不幸的情况,您的脚本命名会导致循环导入不存在的内容。

您可以通过将脚本重命名为其他内容来轻松解决此问题。

【讨论】:

  • 我还建议将 org.py 脚本移出 python32 目录。只有来自实际分发的代码应该在这个目录中。
猜你喜欢
  • 2010-11-18
  • 2018-08-28
相关资源
最近更新 更多