Python错误:"AttributeError:'module'对象没有属性'sha1'"

10

我需要你的帮助,

如何纠正错误AttributeError: 'module' object has no attribute 'sha1',

当我执行命令import random或import hashlib时,出现了这样的结果。

root@thinkad:~# python
Python 2.7.3 (default, Jan  2 2013, 13:56:14) 
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import random
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/random.py", line 49, in <module>
    import hashlib as _hashlib
  File "hashlib.py", line 3, in <module>
    hasher = hashlib.sha1()
AttributeError: 'module' object has no attribute 'sha1'
>>> import math
>>> import hashlib
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "hashlib.py", line 3, in <module>
    hasher = hashlib.sha1()
AttributeError: 'module' object has no attribute 'sha1'
>>> 

1
你能运行 import hashlib; print dir(hashlib), hashlib.__file__ 并将输出包含在问题中吗? - NPE
相同的 AttributeError: 'module' 对象没有属性 'sha1'。 - Droid
4个回答

27

安装了一些brew cask后,做了一些常规清理后出现了问题。然后node-gyp无法重新构建我的node应用程序的某些软件包。重新安装python2帮助了我。

在macOS上:

brew reinstall python@2

更新Python 2解决了我的问题,但似乎Homebrew已经删除了Python@2。您仍然可以按照此其他线程中的说明重新安装它。 - AlCorreia

3

错误原因

当您在执行脚本时(甚至是正在运行的脚本本身),如果有一个与内置模块同名的文件位于同一目录中,则会加载该文件而不是内置模块。

修复方法

要解决此问题,您只需要将文件hashlib.py重命名为其他名称,然后Python解释器将加载内置模块。您还需要删除位于hashlib.py所在目录中的已编译模块hashlib.pyc,否则Python仍将加载该模块。

解释说明

当您import一个模块时,比如import hashlib,Python会按照以下顺序在以下位置查找模块

  1. 包含正在运行的脚本的目录
  2. 内置模块
  3. 包含输入脚本的目录(或者当没有指定文件时,当前目录)
  4. PYTHONPATH环境变量(可能包含目录列表)
  5. 安装相关的默认路径

这意味着如果您执行包含语句import hashlib的脚本hashlib.py,Python将导入该脚本而不是内置模块hashlib。实际上,Python会将您的脚本编译为位于同一目录中的文件hashlib.pyc并导入该已编译的脚本,因此如果只重命名hashlib.py而保留haslib.pyc在原地,Python仍将加载它。因此,您还需要删除haslib.pyc


1

看起来你有一个名为hashlib.py的文件,它妨碍了解释器找到标准的hashlib模块。


1
是的,兄弟:D 谢谢。但是我该怎么删除这些文件? - Droid
@PyDroid 你为什么要删除那个文件?这没有任何意义。那是你的源代码。只需将其重命名,以便不再与“haslib”模块冲突即可。 - David Ferenczy Rogožan
@PyDroid дҪ еҸҜиғҪйңҖиҰҒеҲ йҷӨзҡ„е”ҜдёҖж–Ү件жҳҜзј–иҜ‘еҗҺзҡ„жЁЎеқ—hashlib.pycпјҢеҰӮжһңе®ғиў«еҲӣе»әеңЁдёҺдҪ зҡ„hashlib.pyж–Ү件зӣёеҗҢзҡ„зӣ®еҪ•дёӯгҖӮ - David Ferenczy Rogožan
谢谢,这帮了我很多,我把文件命名为hashlib.py :) 哎呀。感谢您的帮助。 - Jimmy Lin

0

在更新了一个包并引入了新的Python版本后,我在Anaconda环境中遇到了同样的错误。在我的情况下,使用conda remove python命令,然后再使用conda install python=2.7命令解决了这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接