Importing installed package from script raises "AttributeError: module has no attribute" or "ImportError: cannot import name"

Importing installed package from script raises "AttributeError: module has no attribute" or "ImportError: cannot import name"

我有一个名为 requests.py 的脚本,用于导入请求包。该脚本无法访问包中的属性,或者无法导入它们。为什么这不起作用,我该如何解决?

以下代码引发 AttributeError.

import requests

res = requests.get('http://www.google.ca')
print(res)
Traceback (most recent call last):
  File "/Users/me/dev/rough/requests.py", line 1, in <module>
    import requests
  File "/Users/me/dev/rough/requests.py", line 3, in <module>
    requests.get('http://www.google.ca')
AttributeError: module 'requests' has no attribute 'get'

以下代码引发 ImportError.

from requests import get

res = get('http://www.google.ca')
print(res)
Traceback (most recent call last):
  File "requests.py", line 1, in <module>
    from requests import get
  File "/Users/me/dev/rough/requests.py", line 1, in <module>
    from requests import get
ImportError: cannot import name 'get'

或者从 requests 包中的模块导入的代码:

from requests.auth import AuthBase
Traceback (most recent call last):
  File "requests.py", line 1, in <module>
    from requests.auth import AuthBase
  File "/Users/me/dev/rough/requests.py", line 1, in <module>
    from requests.auth import AuthBase
ImportError: No module named 'requests.auth'; 'requests' is not a package

发生这种情况是因为名为 requests.py 的本地模块隐藏了您尝试使用的已安装 requests 模块。当前目录被添加到 sys.path 前面,因此本地名称优先于安装的名称。

出现这种情况时的额外调试提示是仔细查看 Traceback,并意识到您的相关脚本的名称与您尝试导入的模块相匹配:

注意您在脚本中使用的名称:

File "/Users/me/dev/rough/requests.py", line 1, in <module>

您要导入的模块:requests

将您的模块重命名为其他名称以避免名称冲突。

Python 可能会在您的 requests.py 文件旁边生成一个 requests.pyc 文件(在 Python 3 中的 __pycache__ 目录中)。重命名后也将其删除,因为解释器仍将引用该文件,从而重新产生错误。但是,如果 py 文件已被删除,__pycache__ 中的 pyc 文件应该 不会影响您的代码。

在示例中,将文件重命名为 my_requests.py,删除 requests.pyc,然后 运行 再次成功打印 <Response [200]>.

对于原始问题的作者,以及那些搜索“AttributeError: module has no attribute”字符串的人,根据接受的答案,常见的解释是用户创建的脚本有一个名称-与库文件名冲突。但是请注意,问题可能不在于生成错误的脚本的名称(如上例所示),也不在于该脚本显式导入的任何库模块的名称。可能需要一些侦探工作才能找出导致问题的文件。

作为说明问题的示例,假设您正在创建一个脚本,该脚本使用 "decimal" 库来使用十进制数进行精确的浮点计算,并将脚本命名为“mydecimal.py ”包含行“import decimal”。这些都没有问题,但您发现它引发了这个错误:

AttributeError: 'module' object has no attribute 'Number'

如果您之前编写了一个名为“numbers.py”的脚本,就会发生这种情况,因为"decimal"库调用标准库"numbers" 但会找到您的旧脚本。即使您删除了它,也可能无法解决问题,因为 python 可能已将其转换为字节码并将其作为“numbers.pyc”存储在缓存中,因此您必须将其作为嗯。

Python 正在您的 requests.py 模块中寻找请求对象。

要么RENAME那个文件到别的地方,要么使用

from __future__ import absolute_import 

requests.py 模块的顶部。

通过 import requests 导入文件 requests.py,而不是模块。 只需重命名您的文件。