我有一个名为requests.py的脚本,用于导入requests包。脚本无法从包中访问属性,或者无法导入它们。为什么这不起作用,我该怎么解决?
下面的代码引发一个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,因此本地名称优先于已安装的名称。
出现这种情况时,另一个调试技巧是仔细查看回溯,并意识到所讨论脚本的名称与您尝试导入的模块匹配:
请注意脚本中使用的名称:

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

您试图导入的模块:requests
将模块重命名为其他名称以避免名称冲突。
Python可能会在requests.pyc文件旁边(在Python 3的requests.py目录中)生成一个__pycache__文件。在重命名之后也删除它,因为解释器仍会引用该文件,从而重新生成错误。但是,如果已删除pyc文件,__pycache__中的py文件不应影响您的代码。
在本例中,将文件重命名为my_requests.py,删除requests.pyc,然后再次运行将成功打印<Response [200]>

关于python - 从脚本导入已安装的软件包会引发“AttributeError:模块没有属性”或“ImportError:无法导入名称”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40729602/

10-16 15:09