Python Module, externally-managed-environment, venv, pip, uv

  • Aufgrund der immer wieder auftauchenden Verständnis-Probleme bezüglich Pythons virtualenv's beschreibe ich hier eine komfortable Möglichkeit, mit externen Python Modulen umzugehen.

    Seit einiger Zeit (auf Debian-Systemen: seit Bookworm) lassen sich externe Python Module ja nicht mehr systemweit mit pip install ... installieren und beim Versuch kommt die bekannte Meldung, die weitere Details enthält bzw. verlinkt:

    Quote


    Wie in der Meldung beschrieben soll also

    1. mit Hilfe des bei Python mitgelieferten Moduls venv eine virtuelle Umgebung (hier im Beispiel auch "venv" benannt) angelegt und
    2. diese dann aktiviert werden.
    3. In dieser aktivierten Umgebung werden dann mit pip die erforderlichen externen Module installiert
    4. und das Script - immer noch in der aktivierten Umgebung(!) - aufgerufen:
    Bash
    cd new_project 
    python3 -m venv venv 
    source venv/bin/activate 
    
    pip3 install some_external_module 
    
    ./myscript.py 
    
    deactivate 

    (Hinweis: Das frei wählbare Verzeichnis für die virtuelle Umgebung (bei python -m venv venv das zweite "venv") wird automatisch angelegt.)


    Das ist natürlich problemlos so nutzbar, aber:


    Zum installieren und nutzen von Python-Paketen gibt es durchaus einige weitere Alternativen.

    Lange habe ich pipenv verwendet (https://pipenv.pypa.io/en/latest/).

    Vor einiger Zeit habe ich aber uv kennen gelernt (https://github.com/astral-sh/uv).

    Dies gefällt mir so gut, dass ich es inzwischen fast ausschließlich nutze, sobald Python-Module benötigt werden, die nicht (oder nicht in gewünschter Version) per apt installierbar sind.

    Die einfach(st)e Installation erfolgt über den Auto-Installer (ohne sudo!):

    Bash
    curl -LsSf https://astral.sh/uv/install.sh | sh

    Beispiel:


    Die komplette Dokumentation zu uv ist erreichbar auf: https://docs.astral.sh/uv/

    Nutzung:

    Bash
    cd new_project 
    uv init 
    uv add some_external_module 


    Beispiel:


    Das virtualenv wird automatisch in ./.venv erzeugt und später genutzt.

    Im Python-Script sind Shebang und die Importe wie üblich:

    Python: myscript.py
    #!/usr/bin/env python3 
    
    import some_external_module 

    Der Aufruf (mit Nutzung der .venv) lautet nun:

    Bash
    uv run myscript.py


    Noch komfortabler geht es aber folgendermaßen, so dass ein Python-Script "self-contained" sein kann, also keine weiteren Dateien oder Spezial-Aufrufe benötigt:

    Eine relativ neue Möglichkeit ist, eine bestimmte Syntax zu Beginn des Scripts zu nutzen (inline script metadata: https://packaging.python.org/en/latest/spec…script-metadata).

    So können weitere Tools (hier uv) ermitteln, was benötigt wird und das Script auch gleich ausführen:
    (siehe https://docs.astral.sh/uv/guides/scri…executable-file)

    Python: myscript.py
    #!/usr/bin/env -S uv run --script 
    # 
    # /// script 
    # requires-python = ">=3.12" 
    # dependencies = ["icecream", "pysnooper"] 
    # /// 
    
    from icecream import ic
    import pysnooper 


    Das Script muss noch ausführbar gemacht werden:

    Bash
    chmod a+x myscript.py


    Nun ist das Script direkt(!) aufrufbar:

    Bash
    ./myscript.py


    Hier wird das venv on-the-fly erzeugt (in ~/.cache/uv/...) und genutzt, ohne dass der User das explizit angeben oder beachten muss.

    Sehr bequem und sehr performant!

    Edited 7 times, last by simonz (February 6, 2026 at 9:54 PM).

  • Python Module, externally-managed-environment, venv, pip, uv? Schau mal ob du hier fündig wirst!

  • Noch meine Meinung zu `uv`, weil das ganz gut dazu passt.

    Wenn Projekte erstellt werden, die etwas umfangreicher sind und an denen man auch von unterschiedlichen Umgebungen aus arbeitet und dessen Ziel ein installierbares Packages ist, dann finde ich es gut. Beim erstellen wird gleich die `pyproject.toml` und `README.md` erstellt. Weiters wird die `pyproject.toml` fortlaufend aktualisiert, wenn man Packete in die Umgebung installiert:

    Mit `sync` lässt sich das schnell in neuen Umgebungen einrichten. Das bauen des Packages wird auch durch `uv` unterstützt.

    Für Projekte dessen Ergebnis ein Skript ist, würde ich weiterhin bei `pip` bleiben und eine `requirements.txt` erstellen. Die Abhängigkeiten in das Skript zu schreiben ist auf den ersten Blick schon cool und eventuell für Testzwecke sinnvoll. Allerdings habe ich das noch nie genutzt. Aber im allgemeinen nutze ich `uv` noch nicht sehr lange.

    Übrigens lässt sich `uv` auch über `pip` installieren.

    Vielleicht noch als Hinweis zu deiner Anleitung. Man könnte noch anfügen das bei folgendem:

    Code
    python3 -m venv venv

    Das erste `venv` in Kombination mit `-m` dafür steht, dass das Python-Modul mit dem Namen `venv` ausgeführt wird und dass das zweite `venv` der Ort ist, an dem die Umgebung erstellt wird und dass das eine frei wählbare Pfadangabe ist, dessen Zielordner nicht existieren muss.


    Grüße
    Dennis

    🎧 Hate the jocks, the preps, the hippie fuckin' scumbags.
    Heavy-metalers with their awful, pussy hairbands.
    Counting seconds until we can get away.
    Ditching school almost every single day, oh, yeah 🎧

  • Meiner Meinung nach ist der Name "venv" für ein Verzeichnis eines venv ganz schlecht gewählt. Klar, dann sieht man in der Dateistruktur zwar was das ist, aber in der Praxis richtet man ja für jedes Projekt ein eigenes venv ein, das dann auch den Namen des Projekts oder zumindest einen Bezug dazu haben sollte. Bei mir habe ich ein venv für Tests und überhaupt allgemeine Programme und das Verzeichnis nannte ich "pythonvenv". Auf einem anderen RPi hatte ich kürzlich mit flask gespielt und dieses Verzeichnis "flaskvenv" genannt.

    Um es anders zu sagen, sprechende Namen sind auch außerhalb des Codes von Python sinnvoll. :green_wink:

  • hyle: In den Beispielen oben ist die virtuelle Umgebung, also das Verzeichnis venv, in dem jeweilgen Projektverzeichnis, also "projektlokal".

    Natürlich kann man die venvs auch irgendwo zentral speichern, dann macht eine andere Namensgebung natürlich Sinn. (So macht uv das z.B. bei den Scripts mit inline-dependencies, dann in ~/.cache/uv/... )

  • In den Beispielen oben ist die virtuelle Umgebung, also das Verzeichnis venv, in dem jeweilgen Projektverzeichnis, also "projektlokal".

    Das habe ich auch nicht anders verstanden, aber was ich nicht verstanden habe ist, was sonst noch in dem Projektverzeichnis sein soll, vom Verzeichnis venv mal abgesehen. Da kann man das Verzeichnis für das venv auch gleich so benennen und das Überverzeichnis weglassen, denn mehrere aufgerufene Skripte aus verschiedenen Projekten, die aber alle in Verzeichnissen namens venv liegen, würden mich zumindest ziemlich verwirren.

    Ich will hier nicht meckern und ja, das kann man so machen, aber für mich persönlich wäre das irgendwie nicht selbsterklärend, bzw. eindeutig genug.

  • hyle Das Überverzeichnis kann man nicht weg lassen. In das venv-Verzeichnis gehört nur das venv. Alles andere, Quelltext, Dokumentation, requirements.txt, Konfigurationsdatei(en) und so weiter gehört nicht in das venv-Verzeichnis. Das muss problemlos löschbar sein, und das kommt zum Beispiel auch nicht mit in die Versionsverwaltung.

    uv erstellt das Verzeichnis ja auch versteckt als .venv/ und nicht als venv/. Das hat so einen ähnlichen Status wie ein .hg/ oder .git/ Verzeichnis.

    “The most likely way for the world to be destroyed, most experts agree, is by accident. That's where we come in; we're computer professionals. We cause accidents.”
    — Nathaniel Borenstein

  • Ich denke man muss hier etwas unterscheiden zwischen einer Umgebung die projektgebunden ist und einer "allgemeineren". Wenn ich ein Projekt von Hand anlege, verwende ich immer den Namne "venv", allerdings auch als versteckter Ordner in einem Projektordner. Der Inhalt davon ist dann so in die Richtung wie __blackjack__ beschrieben hat.

    Im Gegensatz dazu habe ich aber auch eine Umgebung erstellt, die so Sachen wie "esptool", "ampy" und "picocom" beinhaltet. Der Ordner dieser Umgebung hat bei mir auch einen aussagekräftigen Namen. Hier will ich aber nur die Programme nutzen, mehr nicht. Daher auch kein Projektverzeichnis.

    🎧 Hate the jocks, the preps, the hippie fuckin' scumbags.
    Heavy-metalers with their awful, pussy hairbands.
    Counting seconds until we can get away.
    Ditching school almost every single day, oh, yeah 🎧

  • An weiteres, wie die Doku und Notizen usw. hatte ich nicht gedacht. :blush: Da ist ein übergeordnetes Projektverzeichnis tatsächlich sinnvoll. Einfach nur venv würde ich das Verzeichnis darin aber trotzdem nicht nennen, aber vielleicht bin ich auch der einzige, der sich daran stört.

    BTW: Auf die einfache Idee einen absoluten Pfad für die requirements.txt zu verwenden bin ich bisher auch noch nicht gekommen. :green_smile:

  • Ich oute mich mal als python noob und hab mal ne blöde Frage: venv stellt mir eine virtuelle Umgebung für Python bereit, ohne das "Original" zu ändern, d. h. ich muss immer erstmal mein venv auswählen bevor ich was installiere per pip.
    Mir fehlt der Sinn dahinter, die kleinen Projekte die ich hier bastele sind alle stand-alone ..... ich brauche nicht mehrere venv für verschiedene Zwecke und würde lieber an der Basis meine Anforderungen bedienen und hab damit am Ende ein tailor-made System. In den letzten Projekten nervte das ein wenig, Mit -break-system-package hab ich das in der Vergangenheit umgangen. Schlimm?

  • Schlimm?

    Schlimm ist es nur, wenn einem sein System wichtig ist und man auf so Zeugs wie eine funktionierende Paketverwaltung ( apt ) verzichten kann, nur weil man für eigene Skripte irgendwelche Python-Module installiert hat, bei denen etwas schief gelaufen ist. Ist das einem egal und spielt das keine Rolle, dann ist es auch nicht schlimm. :stumm:

  • 4zap Den Schritt das venv zu aktivieren kann man sich sparen, wenn man direkt das pip aus dem venv ausführt, und Python-Programme, die das venv verwenden sollen, mit dem python aus dem venv.

    Alternativ kann man auch schauen ob man pip überhaupt verwenden muss, und nicht auch alles was man braucht mit apt installieren kann.

    “The most likely way for the world to be destroyed, most experts agree, is by accident. That's where we come in; we're computer professionals. We cause accidents.”
    — Nathaniel Borenstein

  • Mit -break-system-package hab ich das in der Vergangenheit umgangen. Schlimm?

    "Schlimm" kann es werden, wenn du Python-Module, die das System braucht, mit einer neueren Version überschreibst. Das kann in allem zwischen egal bis Vollkatastrophe (=System startet nicht mehr) enden. Bei den allermeisten Linux-Distros ist Python und einige Python-Module integraler Bestandteil der Installation. Theoretisch passiert nichts, solange du A) nicht das System-Python änderst und b) keine Module via pip installierst, die aus der Paketverwaltung kommen und die das System braucht.

    Unter Win ist das unkritisch, weil Win kein Python braucht und mitbringt.

    Mir fehlt der Sinn dahinter, die kleinen Projekte die ich hier bastele sind alle stand-alone .....

    Der Sinn ist: du hast eine isolierte, reproduzierbare Umgebung, die du garantiert frei von Nebeneffekten auf's System ändern und löschen kann.

    ich brauche nicht mehrere venv für verschiedene Zwecke und würde lieber an der Basis meine Anforderungen bedienen und hab damit am Ende ein tailor-made System.

    Dann nutz' halt nur ein venv für alles.

    Wenn man ernsthaft, egal auf welchem Level, mit Python entwickelt und programmiert, kommt man IMHO nicht an venv vorbei. Spätestens dann nicht, wenn man die eigenen Skripte mit einem neuen Major-Release von Python-Modul $FOO testen will oder einfach mal testen möchte, ob Modul $SPAM nicht doch besser geeignet ist als Modul $EGG.

    Alles immer systemweit installieren erinnert mich so ein bisschen an Windows früher: jeder Nutzer hatte OOTB Admin-Rechner und konnte ans komplette System. Worüber sich die Linux-Nutzer lange (zu recht) lustig gemacht haben. Heute zeigen aber einige Linux-Python Nutzer exakt das gleich verhalten. Weil es "einfacher" ist. Manche Sachen waren unter Win auch "einfacher" mit den Admin-Rechten.

    Gruß, noisefloor

  • Was noch gegen ein großes venv spricht: pip installiert Abhängigkeiten gem. der requirements.txt des installierten Moduls $FOO mit. pip kennt aber leider keine Mechanismen, nicht mehr benutzte Abhängigkeiten bei der Deinstallation von $FOO auch zu deinstallieren. D.h. wenn man öfters testweise mal was installiert, endet man ziemlich sicher mit einem Haufen verwaister Module. Kann man theoretisch von Hand bereinigen, ist aber praktisch irgendwo zwischen Höchststrafe und nicht machbar angesiedelt.

    Gruß, noisefloor

  • Ich möchte keine Werbung für uv machen. Im Vergleich zu pip] löscht dass die Abhängigkeiten, die ein Package benötigt.

    Beispiel icecrem

    🎧 Hate the jocks, the preps, the hippie fuckin' scumbags.
    Heavy-metalers with their awful, pussy hairbands.
    Counting seconds until we can get away.
    Ditching school almost every single day, oh, yeah 🎧

  • Moin,

    ich habe zwar verstanden, warum man ein "venv" benötigt, aber wie bringe ich z.B. Thonny dazu, venv als quasi Arbeitsumgebung (der Begriff ist wahrscheinlich nicht richtig) zu nutzen.

    Beispiel:

    Ich wollte auf einem ESP8266 Micropython installieren, aber dem installierten Thonny fehlt esptool. Der Versuch, das über die PlugIn Verwaltung zu installieren, zeigt den bekannten Fehler. Mit der Beschreibung aus #1 habe ich es installiert, aber Thonny nutzt es nicht.

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!