Wie fehlendes Modul (für Import) in Script automatisch (!) nachladen?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
pstein
User
Beiträge: 10
Registriert: Montag 26. Juni 2017, 15:42

Angenommen in einem Python Script (unter Windows) steht der Befehl:

from PIL import Image

Wenn das Modul derzeit nicht existiert bekomme ich eine Fehlermeldung
"ModuleNotFoundError: No module named 'PIL'

Ok, ich kann und muss das dann manuell Nachladen mit

pip install pillow

Das geht natürlich.

Aber könnte man Python nicht vielleicht auch so konfigurieren, dass es AUTOMATISCH (!) fehlende Module nachinstalliert?
...und dann mit der Script Abarbeitung fortfährt ohne Neustart des Scriptes?

Ich rede jetzt nicht programmatisch nachladen mit extra Python codezeilen sondern komplett automatisch von Python aus
einfachTobi
User
Beiträge: 510
Registriert: Mittwoch 13. November 2019, 08:38

Die Dokumentation von pip erklärt das Vorgehen: https://pip.pypa.io/en/latest/user_guid ... ur-program. Wobei das ein eher ungewöhnlicher Ansatz ist. Ich würde erwarten, dass es eine requirements.txt gibt, aus denen ich die Abhängigkeiten manuell installieren kann bzw. dass das Package, welches ich dort über pip installiert habe, sich bereits bei der Installation darum kümmert, dass seine Abhängigkeiten erfüllt sind.
nezzcarth
User
Beiträge: 1733
Registriert: Samstag 16. April 2011, 12:47

Damit das funktioniert, müsste man vom Namen eines zu importierenden Moduls auf das korrespondierende Paket auf PyPi schließen können. Das das ist in manchen Fällen weder einfach noch eindeutig möglich.

Es gibt für das Verteilen von Python Code definierte Mechanismen, die auch die Abhängigkeiten auflösen. Diese sollte man stattdessen verwenden.
Benutzeravatar
__blackjack__
User
Beiträge: 13919
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@pstein: Interessanterweise zeigt gerade dieses konkrete Package ein interessantes Problem: Beim Python-Package `PIL` gehst Du davon aus, dass das PyPI-Package `pillow` installiert werden soll. Warum nicht das PyPI-Package `PIL`? Oder woher weisst Du das nicht `pil-compat` oder `Pillow-PIL` zusätzlich benötigt wird? Vielleicht reicht auch `PIL-Lite` aus? Oder man braucht eigentlich `pil-plus`‽

Das weiss alles der Entwickler des Programms oder Moduls mit diesem Import, und der sollte das dokumentiert haben. Vorzugsweise so, dass sich das einfach mit den Standardmitteln mit einem einzigen Aufruf installieren lässt. Also beispielsweise die schon angesprochene `requirements.txt`.
“I am Dyslexic of Borg, Your Ass will be Laminated” — unknown
Benutzeravatar
noisefloor
User
Beiträge: 4149
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Aber könnte man Python nicht vielleicht auch so konfigurieren, dass es AUTOMATISCH (!) fehlende Module nachinstalliert?
Nein, kann man nicht. Programmatisch: siehe oben.

Aber in der Regel will man doch gar nicht, dass ein Skript ungefragt Software nachinstalliert. Bei Python hättest du noch das Problem: würde ein nachgeladenes Modul nur für den aktuellen Benutzer oder global installiert? Global braucht man unter allen gängigen Betriebssystemen erhöhte Recht. Man erhöhten Rechten möchte man sein Skript aber nicht laufen lassen, wenn nicht zwingend notwendig. Außerdem "erzwingen" neuere Version von pip zumindest unter Linux die Einrichtung eines venv. Will man in der Regel auch nicht automagisch bei der Skriptausführung haben. Und wenn du das Skript nochmal ausführst, wird ein weiteres venv anlegt, weil das andere ja nicht aktiv ist.

Des Weiteren wollen bestimmt Skript bestimmt Versionen oder Mindestversion eines Moduls. Das kann man in der requirements.txt definieren, aber nicht automatisch raten.

Gruß, noisefloor
Benutzeravatar
snafu
User
Beiträge: 6830
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

pstein hat geschrieben: Donnerstag 17. April 2025, 08:16 Aber könnte man Python nicht vielleicht auch so konfigurieren, dass es AUTOMATISCH (!) fehlende Module nachinstalliert?
...und dann mit der Script Abarbeitung fortfährt ohne Neustart des Scriptes?
Mitten im Skript wird das nicht gehen. Man könnte aber einen Skript-Loader schreiben, der beim Ausführen von Skripten vorgeschaltet ist und einen ModuleNotFoundError abfangen kann. Anschließend würde er Vorschläge machen, auf welche Packages aus PyPI der gesuchte Modulname zutrifft. Da könnte der Anwender eine Auswahl treffen und das gewünschte Paket mittels PIP automatisch nachinstallieren lassen. Und am Ende führt der Skript-Loader das Skript dann erneut aus.

Das alles aber IMHO nur für den Fall, dass der übliche Weg mittels "pip install" nicht funktioniert bzw. dass keine requirements.txt vorhanden ist.

Und ob sich dieser Aufwand lohnt, sei mal dahingestellt. Die naheliegende Alternative wäre ja eine manuelle Suche auf pypi.org, bevor man das alles selber parst und ein Programm drumherum schreibt. Höchstens innerhalb einer Entwicklungsumgebung wäre das möglicherweise sinnvoll. Habe ich aber bisher nirgendwo in dieser Form gesehen.
Benutzeravatar
snafu
User
Beiträge: 6830
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@pstein:
Vielleicht ist das Tool "uv" etwas für dich?

Beispiel aus der Doku:

Code: Alles auswählen

import requests
from rich.pretty import pprint

resp = requests.get("https://peps.python.org/api/peps.json")
data = resp.json()
pprint([(k, v["title"]) for k, v in data.items()][:10])

Code: Alles auswählen

uv add --script example.py 'requests<3' 'rich'
uv run example.py
Quelle: https://docs.astral.sh/uv/guides/script ... pendencies
Antworten