2016-03-27 25 views
24

Ho uno script denominato requests.py che importa il pacchetto delle richieste. Lo script non può accedere agli attributi dal pacchetto o non può importarli. Perché non funziona e come lo risolvo?L'importazione del pacchetto installato dallo script genera "AttributeError: module has no attribute" o "ImportError: impossibile importare il nome"

Il codice seguente solleva uno 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' 

Il codice seguente sollevano 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 solleva un 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

Si prega di notare che questo è inteso come una risposta canonica a una domanda comune ... per favore non chiudere come duplicato a meno che non siate sicuri che l'altra domanda abbia una risposta migliore, più completa. – Ffisegydd

risposta

29

Questo accade perché il modulo locale di nome requests.py ombre installato requests modulo che si sta tentando di utilizzare. La directory corrente è anteposta a sys.path, quindi il nome locale ha la precedenza sul nome installato.

Un consiglio extra debugging quando questo si avvicina è quello di guardare il Traceback con attenzione, e rendersi conto che il nome dello script in questione è la corrispondenza del modulo che si sta tentando di importare:

Avviso il nome utilizzato in lo script:

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

il modulo che si sta tentando di importare: requests

Rinominare il modulo a qualcosa d'altro per evitare il nome di collisione.

Python può generare un file requests.pyc accanto al file requests.py (nella directory __pycache__ in Python 3). Rimuovilo anche dopo la rinomina, poiché l'interprete farà ancora riferimento a quel file, riproducendo l'errore. Tuttavia, il file pyc in __pycache__dovrebbe non influenzare il codice se il file py è stato rimosso.

Nell'esempio, la ridenominazione del file su my_requests.py, la rimozione di requests.pyc e l'esecuzione di nuovo stampa correttamente <Response [200]>.