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

匿名 (未验证) 提交于 2019-12-03 01:48:02

问题:

I have a script named requests.py that imports the requests package. The script either can't access attributes from the package, or can't import them. Why isn't this working and how do I fix it?

The following code raises an 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      import requests   File "/Users/me/dev/rough/requests.py", line 3, in      requests.get('http://www.google.ca') AttributeError: module 'requests' has no attribute 'get' 

The following code raises an ImportError.

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

The following code raises an 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      from requests.auth import AuthBase   File "/Users/me/dev/rough/requests.py", line 1, in      from requests.auth import AuthBase ImportError: No module named 'requests.auth'; 'requests' is not a package 

回答1:

This happens because your local module named requests.py shadows the installed requests module you are trying to use. The current directory is prepended to sys.path, so the local name takes precedence over the installed name.

An extra debugging tip when this comes up is to look at the Traceback carefully, and realize that the name of your script in question is matching the module you are trying to import:

Notice the name you used in your script:

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

The module you are trying to import: requests

Rename your module to something else to avoid the name collision.

Python may generate a requests.pyc file next to your requests.py file (in the __pycache__ directory in Python 3). Remove that as well after your rename, as the interpreter will still reference that file, re-producing the error. However, the pyc file in __pycache__ should not affect your code if the py file has been removed.

In the example, renaming the file to my_requests.py, removing requests.pyc, and running again successfully prints .



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!