Python 3 Probleme: Bibliotheken/ Module importieren über relative o. absolute Pfade | ModuleNotFoundError

Ein Code-Einzeiler ist in Python schnell geschrieben und funktioniert als Test wunderbar. Doch spätestens, wenn eine Bibliothek oder ein Modul eingebunden werden muss, stehst du oft vor Problemen.

Fehlermeldung: ModuleNotFoundError

In diesem Beitrage geht es um die Installation und Ausführung von Python Modulen in Windows. Bei Linux gestalten Pfade sich anders. Es wird ein in Windows-Umgebungen häufig anzutreffender Fehler beschrieben und erklärt.

Folgende Fehlermeldung kann: ModuleNotFoundError: No module named ‚Modulname‘

Dieser Fehler tritt auf, wenn Pfade nicht gefunden werden, weil etwa ein relativer Pfad statt ein absoluter Pfad angegeben wurden.

Ein ModuleNotFoundError wird ausgelöst, wenn Python ein Modul nicht erfolgreich importieren kann.

  • Der Name des Moduls ist falsch
  • Der Pfad des Moduls ist falsch
  • Die Bibliothek ist nicht installiert

Ursache des Fehlers

Was passiert, wenn per Befehl „import requests“ eine Bibliothek geladen werden soll?

Zuerst durchsucht Python das Modul sys.modules, ein Cache aller zuvor importierten Module. Dort wird der korrekte Pfad notiert sein, wenn das gesuchte Modul schon einmal erfolgreich importiert wurde.

War dies nicht erfolgreich und der Name der Bibliothek/ Modul wurde nicht im Cache gefunden, wird jetzt eine Liste der integrierten Module durchgegangen. Hierbei handelt es sich um vorinstallierte Module der Python-Standardbibliothek.

Wenn der gesuchte Name auch in der Python Standard-Bibliothek nicht gefunden wird, sucht Python in einer Liste von Verzeichnissen weiter, die im Modul sys.path hinterlegt sind. Diese Liste enthält Verzeichnisse, die durchsucht werden soll. Ist darin nicht der Pfad zu deinem Modulenthalten, wird es nicht gefunden.

Wenn Python das Modul findet, wird es eingebunden und alles ist okay.
Wenn der Name nicht gefunden wird, antwortet der Interpreter mit der Fehlermeldung ModuleNotFoundError und du landest über eine Google-Suche möglicherweise auf diese Webseite.

Beispiel: Bibliothek „requests“ wird nicht gefunden

Das folgende Skript soll den Text einer Webseite auslesen und ausgeben.

import requests 							# Bibliothek 'requests' wird importiert
r = requests.get('https://www.ddr.center') 	# Verbindung wird aufgebaut und Inhalt gelesen
print(r.status_code) 						# Ausgabe des Status-Code
print(r.text) 								# Text der Webseite wird ausgegeben

Doch bei der Ausführung passiert ein Fehler!

Im Bild1 wird eine Python-Datei mit einem Import-Befehl geladen. Dieser Einzeiler soll lediglich das Python-Modul requests laden. Bei Run klickst du auf „Run Module“ und bekommst (wie im Bild 2 abgebildet) eine Fehlermeldung angezeigt. Das Modul requests wurde nicht gefunden.

Wo befindet sich die Bibliothek „requests“ aktuell?

Die Bibliothek requests mit ihren Modulen befindet sich (bei mir!) auf der Festplatte „C:“ im Verzeichnis „\Python3\Lib\site-packages\requests“. Es kann bei der Fehlersuche nicht davon ausgegangen werden, dass diese Bibliothek mit ihren Modulen auf dem Windows-Computer fehlt. Sie ist definitiv vorhanden.

Die Frage ist nun: Sucht beim „import-“ Befehl mein Python-Interpreter in dem Verzeichnis \site-packages\ nach dem Modul? Oder ist das nicht der Fall? Rührt daher die angezeigte Fehlermeldung, dass eine Datei nicht gefunden wurde?

Fehlerhafter Pfad zur Bibliothek „requests“

Wenn Du wissen willst, ob der Python-Interpreter grundsätzlich funktioniert, ziehst du den Ordner mit der Bibliothek „requests“ einfach in den Ordner, in dem sich dein kleines Testscript befindet.

Bei mir liegt mein Testscript im Verzeichnis „C:\Python3“.

Wenn Du jetzt dein Testscript mit dem Befehl „import requestes“ ausführst, wird damit begonnen, die Bibliothek requests zu laden, wie der grüne Rahmen (Bild 1)aufzeigt. Der hinterlegte Pfad ist also (jetzt) der Richtige.

Allerdings produziert Zeile 43 (Bild 1) in der Datei „__int__.py“ einen Fehler (Bild 2), als versucht wird, das Modul „urllib3“ zu laden.

Der Grund: Die eingetragenen Pfade verstehen sich als relativer Pfad. Wenn du das Modul in ein anderes Verzeichnis verschiebst, wird es zwar gefunden, aber nicht die in ihm enthaltenen anderen Module/Dateien.

Fazit: Die Bibliothek ist auf deinem PC vorhanden, wird jedoch anhand eines fehlerhaften Pfads nicht gefunden.

Eingetragene Python-Pfade herausfinden

Aber welche Pfade/Verzeichnisse durchpflügt der Python-Interpreter (bei mir) auf der Suche nach zu importierenden Modulen?

Ganz einfach:

  • Öffne die Python IDLE Shell,
  • importiere das Modul „sys“ und
  • frage mit „sys.path“ die eingetragenen Pfade ab.

In meinem Fall bekomme ich angezeigt:

‚C:\Python3‘,
‚C:\Program Files\Python38\python38.zip‘,
‚C:\Program Files\Python38\DLLs‘,
‚C:\Program Files\Python38\lib‘,
‚C:\Program Files\Python38‘,
‚C:\Program Files\Python38\lib\site-packages

Zwar wird ein Ordner „C:\Program Files\Python38\lib\site-packages“ beim Import durchsucht (laut sys.path), aber der Pfad haut nicht hin, dieser Ordner enthält nicht alle meine Bibliotheken und Module.

Die allermeisten Module, eigentlich fast alle, sind in einem völlig anderen Verzeichnis gespeichert.

Der folgende Screenshot gibt ein Bild davon wieder, wo der Unterschied bei den beiden Verzeichnissen „site-packages“liegen.

Den richtigen Pfad eintragen

Wir haben erkannt: Die Bibliothek ist vorhanden, allerdings in einem Unterverzeichnis, welches Python 3.8 nicht bekannt ist.

„C:\Python3\Lib\site-packages\requests“

Diesen Pfad müssen wir jetzt Python vermitteln. Aber wie? Wo trägst Du diesen Pfad ein? In welche Datei? Und vor allem – in welchem Ordner?

‚C:\Program Files\Python38\…‘

oder

C:\Python3\… ?

Zuvor lief bei mir 2021 eine ältere Python-Version. Offenbar habe ich bei der neueren Installation von Python 3.8 etwas falsch gemacht und nun liegen an zwei verschiedenen Orten auf meiner Festplatte unterschiedliche Installationen. Eventuell sollte ich alles komplett löschen und Python 3.8 neu aufsetzen?

PYTHONPATH auf Windows- Computer definieren

PYTHONPATH ist eine Windows-Umgebungsvariable, die du setzen kannst, um Verzeichnisse hinzuzufügen, in denen Python nach Bibliotheken, Modulen und Paketen sucht. In der Regel weiß (ein korrekt installiertes) Python die Pfade zu seinen Modulen. Doch wenn du beispielsweise bereits eine andere Python-Version auf deinem Computer hast, kann da einiges schieflaufen, Pfade sind unzutreffend, Module werden nicht gefunden und der Interpreter präsentiert dir die Fehlermeldung: ModuleNotFoundError: No module named ‚Modulname‘.

  • Rufe dein Windows-Explorer auf
  • Rechts-Klick auf „Computer“ –> Eigenschaften
  • Im Fenster SYSTEM auf Erweiterte Systemeinstellungen gehen
  • Fenster SYSTEMEIGENSCHAFTEN –> Erweitert –> Umgebungsvariablen
  • Klicke auf „Neu…“, um eine neue Benutzervariable anzulegen
  • Fülle die Eingabefelder aus und speichere mit „OK“.
  • Starte dein Computer neu.

Das war es gewesen – Problem wurde gelöst.

Neuen Pfad mit sys.path.append() angeben

Wenn Dir der obige Weg zu kompliziert erscheint, oder deine Module auf dem Computer verstreut anzufinden sind, kannst du alternativ direkt im Python-Script eine Zeile einfügen, welche dem Interpreter den richtigen Weg zu deinem Modul zeigt.

import requests
sys.path.append('C.\Phyton3\Lib\site-packages')

Stolperfallen

Liniux und Windows bauen und kennzeichnen ihre Pfade unterschiedlich, was wichtig zu wissen ist, wenn Codeschnipsel aus dem Internet übernommen werden. Es ist leicht möglich, dass Scripte lediglich aufgrund einer falschen Syntax bei den Pfadangaben nicht funktionieren.

Windows Pfadangaben

Unter Windows wird einem Pfad ein Kennbuchstabe für das Laufwerk, in dem sich der Datenträger befindet, vorangestellt.

C:\Phython3\lib\site-packages\info.txt“

„C:“ bezeichnet das Laufwerk, die Festplatte, in dem die Datei liegt. Danach kommt das Verzeichnis „\Pyhton3“, gefolgt vom Ordner „\Lib“ und „\site-packages“. In diesem, letzten Ordner liegt die Textdatei „info.txt.

Unterschied zu Linux: Windows notiert am Anfang den Buchstaben der Festplatte und trennt Verzeichnisse (Ordner) mittels Backslash (\, umgedrehter Schrägstrich).

Linux Pfadangaben

Unter Unix und Unix-Derivaten (Linux, NetBSD, etc) gibt es ein Root-Verzeichnis (Wurzelverzeichnis, root directory), von dem ausgehend verzeichnisorientiert adressiert wird. Das Rootverzeichnis liegt auf dem Datenträger, von dem aus der Systemstart erfolgt.

/home/benutzer/beispieldatei.txt

Aus der Unix-Pfadangabe allein ist – im Gegensatz zu Windows – nicht ersichtlich, auf welchem physikalischen Datenträger eine Datei liegt.

Unterschied zu Windows: Linux notiert am Anfang nicht den Laufwerks-Buchstaben und trennt Verzeichnisse (Ordner) mittels eines normalen Schrägstrichs (/).

Problem gelöst!

Das Problem mit den fehlenden Modulen war die Folge einer unsauberen Installation von mehreren Python-Versionen in unterschiedlichen Ordnern und einem unkontrollierten Löschen von vermeintlich nicht mehr benötigten Verzeichnissen. Egal, ob du die Lösung mit dem PYTHONPATH, oder „sys.path.append()“ nutzt – Dein Problem dürfte jetzt verschwunden sein.

Rubrik (deutsch): Tutorial, Anleitung, Fehler, Probleme, Hilfe