2016-03-27 12 views
24

Ich habe ein Skript mit dem Namen requests.py, das das Anforderungspaket importiert. Das Skript kann entweder nicht auf Attribute aus dem Paket zugreifen oder diese nicht importieren. Warum funktioniert das nicht und wie repariere ich es?Importieren von installiertem Paket aus dem Skript löst "AttributeError: Modul hat kein Attribut" oder "ImportError: Name kann nicht importiert werden"

Der folgende Code löst eine 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' 

Der folgende Code stellt eine 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 wirft ein 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

Bitte beachten Sie, dass dies als eine kanonische Antwort auf eine allgemeine Frage gedacht ist ... Bitte schließen Sie nicht als Duplikat, es sei denn, Sie sind sicher, dass die andere Frage eine bessere, vollständigere Antwort hat. – Ffisegydd

Antwort

29

Dies geschieht, weil Ihr lokales Modul requests.py Schatten der installierten requests Modul, das Sie versuchen, verwenden benannt. Das aktuelle Verzeichnis ist sys.path vorangestellt, daher hat der lokale Name Vorrang vor dem installierten Namen.

Ein zusätzlicher Debug-Tipp, wenn diese nach oben kommt, ist sorgfältig auf der Traceback zu sehen und erkennt, dass der Name des Skripts in Frage das Modul wird passend Sie importieren versuchen:

Beachten Sie die Sie verwendeten Namen in Ihr Skript:

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

Das Modul Sie importieren versuchen: requests

auf etwas anderes Benennen Sie Ihre Modul den Namen Kollision zu vermeiden.

Python kann eine requests.pyc Datei neben Ihrer requests.py Datei (im Verzeichnis __pycache__ in Python 3) generieren. Entfernen Sie das auch nach dem Umbenennen, da der Interpreter immer noch auf diese Datei verweist und den Fehler reproduziert. Die pyc Datei in __pycache__sollte Ihren Code jedoch nicht beeinträchtigen, wenn die Datei py entfernt wurde.

In dem Beispiel wird die Datei in my_requests.py umbenannt, requests.pyc wird entfernt und erneut erfolgreich ausgeführt <Response [200]> gedruckt.