2016-03-27 4 views
24

У меня есть сценарий с именем requests.py, который импортирует пакет запросов. Сценарий либо не может получить доступ к атрибутам из пакета, либо не может их импортировать. Почему это не работает и как я могу это исправить?Импорт установленного пакета из сценария повышает значение «AttributeError: модуль не имеет атрибута» или «ImportError: невозможно импортировать имя»

Следующий код вызывает 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' 

The following code поднимает 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 
+18

Обратите внимание, что это предназначено как канонический ответ на общий вопрос ... пожалуйста, не закрывайте дубликаты, если вы не уверены, что у другого вопроса есть лучший, более полный ответ. – Ffisegydd

ответ

29

Это происходит потому, что ваш локальный модуль с именем requests.py тени установленного requests модуля, который вы пытаетесь использовать. Текущая директория добавляется к sys.path, поэтому локальное имя имеет приоритет над установленным именем.

Дополнительный наконечник отладки, когда это приходит, чтобы посмотреть на TraceBack внимательно, и понять, что имя вашего сценария в вопросе согласования модуля, который вы пытаетесь импортировать:

Уведомления имя, которое используется в сценарий:

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

модуль вы пытаетесь импорта: requests

Переименовать модуль к чему-то еще, чтобы избежать столкновения имя.

Python может сгенерировать файл requests.pyc рядом с вашим файлом requests.py (в каталоге __pycache__ на Python 3). Удалите это также после переименования, поскольку интерпретатор все равно будет ссылаться на этот файл, повторно создавая ошибку. Однако файл pyc в __pycache__должен не повлиять на ваш код, если файл py удален.

В примере, переименовав файл в my_requests.py, удалив requests.pyc и снова выполнив успешную печать <Response [200]>.

 Смежные вопросы

  • Нет связанных вопросов^_^