从脚本导入已安装的软件包引发“AttributeError:模块没有属性”或“ImportError:无法导入名称”

我有一个名为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' 

下面的代码引发了一个ImportError

 from requests.auth import AuthBase class PizzaAuth(AuthBase): """Attaches HTTP Pizza Authentication to the given Request object.""" def __init__(self, username): # setup any auth-related data here self.username = username def __call__(self, r): # modify and return the request r.headers['X-Pizza'] = self.username return r 
 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前缀,因此本地名称优先于已安装的名称。

当出现这个问题时,额外的debugging技巧是仔细观察Traceback,并且认识到你的脚本的名字与你正试图导入的模块匹配:

注意你在脚本中使用的名字:

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

您尝试导入的模块: requests

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

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

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