Wie man den Python-Systempfad überprüft, um notwendige Module zu finden

PythonBeginner
Jetzt üben

Einführung

In der Welt der Python-Programmierung ist das Verständnis und die Verwaltung des Systempfads (system path) entscheidend, um notwendige Module zu finden und zu nutzen. Dieses Tutorial führt Sie durch den Prozess der Überprüfung des Python-Systempfads sowie dessen Modifizierung, um sicherzustellen, dass Ihre Projekte Zugriff auf die erforderlichen Abhängigkeiten (dependencies) haben.

Das Verständnis des Python-Pfads

Der Python-Pfad, auch bekannt als sys.path, ist eine Liste von Verzeichnissen, die Python durchsucht, wenn es versucht, ein Modul zu importieren. Dies ist ein wichtiges Konzept, da es bestimmt, wo Python nach den notwendigen Modulen und Paketen sucht, wenn Sie Ihren Code ausführen.

Was ist der Python-Pfad?

Der Python-Pfad ist eine Liste von Verzeichnissen, die Python durchsucht, wenn es versucht, ein Modul zu importieren. Wenn Sie ein Modul in Ihrem Python-Code importieren, sucht Python nach dem Modul in den Verzeichnissen, die in der sys.path-Liste angegeben sind.

Die sys.path-Liste enthält typischerweise die folgenden Verzeichnisse:

  • Das Verzeichnis, das das Eingabe-Skript (das Skript, das Sie ausführen) enthält
  • Die Umgebungsvariable PYTHONPATH (falls gesetzt)
  • Die installationsabhängigen Standardverzeichnisse für Standardbibliotheken und Site-Packages (site-packages).

Sie können den aktuellen Python-Pfad mithilfe des sys.path-Attributs in Ihrem Python-Code anzeigen. Erstellen wir ein einfaches Python-Skript, um dies in Aktion zu sehen.

Öffnen Sie das WebIDE-Terminal und navigieren Sie zu Ihrem Projektverzeichnis, falls Sie sich noch nicht dort befinden. Das Standardverzeichnis ist /home/labex/project.

Erstellen Sie nun eine neue Datei namens check_path.py im Verzeichnis /home/labex/project mit dem WebIDE-Editor.

Fügen Sie den folgenden Code in die Datei check_path.py ein:

import sys
print(sys.path)

Speichern Sie die Datei.

Führen Sie nun das Skript über das Terminal aus:

python check_path.py
Output of checking Python path

Sie sehen eine ähnliche Ausgabe wie diese:

['/home/labex/project', '/usr/lib/python310.zip', '/usr/lib/python3.10', '/usr/lib/python3.10/lib-dynload', '/home/labex/.local/lib/python3.10/site-packages', '/usr/local/lib/python3.10/dist-packages', '/usr/lib/python3/dist-packages']

Diese Ausgabe zeigt die Liste der Verzeichnisse, die Python durchsucht hat, als Sie das Skript ausgeführt haben. Der erste Eintrag ist das Verzeichnis, in dem sich das Skript befindet (/home/labex/project). Die anderen Einträge sind Standard-Python-Bibliotheks- und Site-Package-Verzeichnisse.

Das Verständnis der Struktur des Python-Pfads

Der Python-Pfad ist als eine Liste von Verzeichnissen strukturiert. Jedes Verzeichnis in der Liste repräsentiert einen Ort, an dem Python nach Modulen und Paketen sucht. Die Reihenfolge der Verzeichnisse in der Liste ist wichtig, da Python die Verzeichnisse in der Reihenfolge durchsucht, in der sie in der Liste erscheinen.

Wenn Sie beispielsweise ein benutzerdefiniertes Modul im Verzeichnis /path/to/my/module haben und dieses Modul in Ihrem Python-Code importieren möchten, müssen Sie sicherstellen, dass das Verzeichnis /path/to/my/module im Python-Pfad enthalten ist.

graph TD A[Python Script] --> B[sys.path] B --> C[/home/labex/project] B --> D[/usr/lib/python3.10/site-packages] B --> E[/usr/lib/python3.10] B --> F[/home/labex/.local/lib/python3.10/site-packages]

In dem obigen Diagramm versucht das Python-Skript, ein Modul zu importieren, und die sys.path-Liste enthält mehrere Verzeichnisse, in denen Python nach dem Modul sucht.

Überprüfen des Python-Pfads mit dem site-Modul

Im vorherigen Schritt haben Sie sys.path verwendet, um die Verzeichnisse anzuzeigen, die Python durchsucht. Ein weiteres nützliches Modul, um zu verstehen, wo Python nach Paketen sucht, insbesondere nach Site-Packages (site-packages) (Drittanbieterpakete, die über pip installiert wurden), ist das site-Modul.

Die Funktion site.getsitepackages() gibt eine Liste von Verzeichnissen zurück, in denen Python nach Site-Packages sucht.

Lassen Sie uns das Skript check_path.py ändern, um auch das site-Modul zu verwenden.

Öffnen Sie die Datei check_path.py im WebIDE-Editor.

Fügen Sie die folgenden Zeilen nach dem vorhandenen Code in das Skript ein:

import site

print("\nsite.getsitepackages():")
print(site.getsitepackages())

Die vollständige Datei check_path.py sollte nun wie folgt aussehen:

import sys
import site

print("sys.path:")
print(sys.path)

print("\nsite.getsitepackages():")
print(site.getsitepackages())

Speichern Sie die Datei.

Führen Sie das Skript nun erneut über das Terminal aus:

python check_path.py

Sie sehen eine ähnliche Ausgabe wie diese:

sys.path:
['/home/labex/project', '/usr/lib/python310.zip', '/usr/lib/python3.10', '/usr/lib/python3.10/lib-dynload', '/home/labex/.local/lib/python3.10/site-packages', '/usr/local/lib/python3.10/dist-packages', '/usr/lib/python3/dist-packages']

site.getsitepackages():
['/home/labex/.local/lib/python3.10/site-packages', '/usr/local/lib/python3.10/dist-packages', '/usr/lib/python3/dist-packages']

Beachten Sie, dass die Ausgabe von site.getsitepackages() eine Teilmenge der Verzeichnisse in sys.path ist. site.getsitepackages() zeigt speziell die Orte an, an denen typischerweise Drittanbieterpakete installiert werden.

Durch die Verwendung von sowohl sys.path als auch site.getsitepackages() erhalten Sie ein vollständigeres Bild davon, wo Python auf Ihrem System nach Modulen und Paketen sucht.

Temporäres Ändern des Python-Pfads

In einigen Fällen müssen Sie möglicherweise ein Verzeichnis zum Python-Pfad für ein bestimmtes Skript oder eine bestimmte Sitzung hinzufügen. Dies ist nützlich, wenn Sie ein benutzerdefiniertes Modul entwickeln oder ein Modul verwenden, das nicht im Standard-Python-Pfad installiert ist.

Sie können den Python-Pfad innerhalb eines laufenden Skripts vorübergehend ändern, indem Sie sys.path.append() verwenden.

Erstellen wir ein neues Verzeichnis und ein einfaches Modul darin, um dies zu demonstrieren.

Erstellen Sie im Terminal ein neues Verzeichnis namens my_custom_modules in Ihrem Projektverzeichnis:

mkdir /home/labex/project/my_custom_modules

Erstellen Sie nun eine neue Datei namens my_module.py im Verzeichnis my_custom_modules mit dem WebIDE-Editor.

Fügen Sie den folgenden Code zu my_module.py hinzu:

def greet(name):
  return f"Hello, {name} from my_module!"

Speichern Sie die Datei.

Erstellen Sie als Nächstes ein neues Python-Skript namens use_custom_module.py im Verzeichnis /home/labex/project.

Fügen Sie den folgenden Code zu use_custom_module.py hinzu:

import sys
import os

## Get the absolute path to the custom modules directory
custom_modules_path = os.path.join(os.path.dirname(__file__), 'my_custom_modules')

## Add the custom modules directory to sys.path
sys.path.append(custom_modules_path)

## Now you can import my_module
import my_module

message = my_module.greet("LabEx User")
print(message)

## Optional: Print sys.path again to see the added directory
print("\nUpdated sys.path:")
print(sys.path)

Speichern Sie die Datei.

In diesem Skript erstellen wir zuerst den absoluten Pfad zum Verzeichnis my_custom_modules mit os.path.join und os.path.dirname(__file__). Dies macht das Skript portabler. Dann verwenden wir sys.path.append(), um dieses Verzeichnis zum Python-Pfad hinzuzufügen. Nachdem wir das Verzeichnis angehängt haben, können wir my_module erfolgreich importieren.

Führen Sie das Skript über das Terminal aus:

python use_custom_module.py

Sie sollten eine ähnliche Ausgabe wie diese sehen:

Hello, LabEx User from my_module!

Updated sys.path:
['/home/labex/project', '/usr/lib/python310.zip', '/usr/lib/python3.10', '/usr/lib/python3.10/lib-dynload', '/home/labex/.local/lib/python3.10/site-packages', '/usr/local/lib/python3.10/dist-packages', '/usr/lib/python3/dist-packages', '/home/labex/project/my_custom_modules']

Die Ausgabe zeigt, dass die Funktion greet aus my_module erfolgreich aufgerufen wurde und das Verzeichnis my_custom_modules für die Ausführung dieses Skripts zu sys.path hinzugefügt wurde.

Diese Methode zum Ändern von sys.path ist temporär und wirkt sich nur auf die Ausführung des aktuellen Skripts aus.

Permanentes Ändern des Python-Pfads mit PYTHONPATH

Während das Ändern von sys.path innerhalb eines Skripts für temporäre Änderungen nützlich ist, möchten Sie möglicherweise ein Verzeichnis zum Python-Pfad für alle Ihre Python-Sitzungen oder für ein bestimmtes Projekt hinzufügen, ohne einzelne Skripte zu ändern. Dies kann durch Setzen der Umgebungsvariablen PYTHONPATH erreicht werden.

Die Umgebungsvariable PYTHONPATH ist eine Liste von Verzeichnissen, die Python beim Start zu sys.path hinzufügt.

Um die Umgebungsvariable PYTHONPATH für Ihre aktuelle Terminal-Sitzung zu setzen, können Sie den Befehl export verwenden.

Entfernen wir die Zeile sys.path.append() aus use_custom_module.py und verwenden stattdessen PYTHONPATH.

Öffnen Sie use_custom_module.py im WebIDE-Editor und entfernen Sie die folgenden Zeilen:

## Get the absolute path to the custom modules directory
custom_modules_path = os.path.join(os.path.dirname(__file__), 'my_custom_modules')

## Add the custom modules directory to sys.path
sys.path.append(custom_modules_path)

Die Datei use_custom_module.py sollte nun wie folgt aussehen:

import sys
import os

## Now you can import my_module
import my_module

message = my_module.greet("LabEx User")
print(message)

## Optional: Print sys.path again to see the added directory
print("\nUpdated sys.path:")
print(sys.path)

Speichern Sie die Datei.

Versuchen Sie nun, das Skript auszuführen, ohne PYTHONPATH zu setzen:

python use_custom_module.py

Sie erhalten wahrscheinlich einen ModuleNotFoundError, da Python my_module nicht finden kann.

Traceback (most recent call last):
  File "/home/labex/project/use_custom_module.py", line 5, in <module>
    import my_module
ModuleNotFoundError: No module named 'my_module'

Setzen wir nun die Umgebungsvariable PYTHONPATH im Terminal, um unser benutzerdefiniertes Modulverzeichnis einzuschließen. Stellen Sie sicher, dass Sie sich im Verzeichnis /home/labex/project befinden.

export PYTHONPATH="/home/labex/project/my_custom_modules:$PYTHONPATH"

Dieser Befehl fügt /home/labex/project/my_custom_modules am Anfang der Variablen PYTHONPATH hinzu. Das $PYTHONPATH am Ende stellt sicher, dass alle vorhandenen Verzeichnisse in PYTHONPATH erhalten bleiben.

Führen Sie das Skript use_custom_module.py nun erneut in derselben Terminal-Sitzung aus:

python use_custom_module.py

Sie sollten die Ausgabe sehen, die anzeigt, dass das Modul gefunden und ausgeführt wurde:

Hello, LabEx User from my_module!

Updated sys.path:
['/home/labex/project', '/home/labex/project/my_custom_modules', '/usr/lib/python310.zip', '/usr/lib/python3.10', '/usr/lib/python3.10/lib-dynload', '/home/labex/.local/lib/python3.10/site-packages', '/usr/local/lib/python3.10/dist-packages', '/usr/lib/python3/dist-packages']

Beachten Sie, dass /home/labex/project/my_custom_modules jetzt in sys.path enthalten ist, da wir die Umgebungsvariable PYTHONPATH gesetzt haben.

Das Setzen von PYTHONPATH im Terminal mit export wirkt sich nur auf die aktuelle Terminal-Sitzung aus. Um die Änderung dauerhaft zu machen, würden Sie den Befehl export normalerweise zur Startdatei Ihrer Shell hinzufügen (z. B. ~/.bashrc, ~/.zshrc). Für dieses Lab ist es jedoch ausreichend, es in der aktuellen Sitzung zu setzen, um das Konzept zu demonstrieren.

Zusammenfassung

In diesem Lab haben Sie gelernt, wie Sie den Python-Systempfad (sys.path) überprüfen und ändern können. Sie haben sys.path und site.getsitepackages() verwendet, um die Verzeichnisse zu inspizieren, in denen Python nach Modulen sucht. Sie haben auch zwei Methoden zum Hinzufügen von Verzeichnissen zum Python-Pfad kennengelernt: temporär innerhalb eines Skripts mit sys.path.append() und dauerhafter für eine Sitzung mit der Umgebungsvariablen PYTHONPATH. Das Verständnis und die Verwaltung des Python-Pfads ist eine grundlegende Fähigkeit, um Ihre Python-Projekte zu organisieren und sicherzustellen, dass Ihr Code die notwendigen Module und Pakete finden kann.