Shebang und venv

  • Da gerade mal wieder 'Sie bangte' sprich Shebang kurz Thema war, eine Frage in Verbindung zum virtuellen Environment dazu.

    Man erstellt sich ein venv. Jetzt sagt ja der Shebang (1. Zeile im Skript), daß das Programm, was nach dem Shebang angegeben ist, zur Ausführung des Skriptes verwendet werden soll.

    Wenn ich jetzt da den Pfad und Programmnamen zu dem für das venv vorgesehene Python reinschreibe, kann ich es einfach mit Pfad/Skriptname aufrufen.

    Beispiel (schematisch):

    Was meint ihr dazu?

    Wenns ner net G'wittern tun tut.

  • Was meint ihr dazu?

    Genau so! Das venv muss ja nicht gestartet werden, wenn der Shebang im Skript auf den Interpreter im venv zeigt. Das Skript muss aber im Verzeichnis des venv liegen, damit die evtl. dort installierten Module gefunden werden. (//Edit: Das war Unsinn!)

  • Hallo,

    das Skript liegt ja nicht in `bin` ?

    Code
    [dennis@dennis Forum]$ ls -la
    insgesamt 8
    drwxr-xr-x. 1 dennis dennis   52 26. Sep 13:23 .
    drwxr-xr-x. 1 dennis dennis  364 24. Sep 09:41 ..
    drwxr-xr-x. 1 dennis dennis  138 26. Sep 08:54 .idea
    -rwxr-xr-x. 1 dennis dennis 2030 26. Sep 16:38 main.py
    -rw-r--r--. 1 dennis dennis 2164 26. Sep 13:23 pycopy.py
    drwxr-xr-x. 1 dennis dennis   76 26. Sep 09:02 .venv


    Python
    #!/home/dennis/PycharmProjects/Forum/.venv/bin/python
    from icecream import ic
    
    def main():
        ic('Hello World!')
    
    if __name__ == "__main__":
        main()


    Code
    [dennis@dennis Forum]$ chmod +x main.py
    [dennis@dennis Forum]$ ./main.py
    ic| 'Hello World!'

    So kenne ich es.


    Grüße
    Dennis


    Edit: `icecream` ist nicht in der Standardbibliothek, das Beispiel zeigt, dass das in der Umgebung installierte Paket gefunden wird.

    🎧 Für mich ist es Erfolg, wenn man ein Lächeln schenkt
    Und wer Drama will, bekommt auch ein Happy End 🎧

  • Dennis89 Mmh, es ist nicht zu erkennen, von wo aus Du es aufrufst.

    cd /var
    /pfad/zu/main.py

    funktioniert auch? (wegen cron-Job wichtig)


    Edit: [undefined] Dennis89[/undefined]vergiß meine Frage. Ich habe bei
    /home2/skripts/sensors/bin/python3 /home2/skripts/sensors/bin/myScript.py
    nur im venv liegende Pakete und es funktioniert. Das würde es auch bei
    /home2/skripts/sensors/bin/myScript.py

    Wenns ner net G'wittern tun tut.

    Edited once, last by Bergwichtel: Edit wegen zu langsamen denkens. ;-) (September 26, 2024 at 6:59 PM).

  • Aus Sicht eines Softwareentwicklers:

    Du schreibst halt den Pfad von deinem Interpreter direkt in den Code rein, während sich /usr/bin/env das erste python aus dem PATH sucht. Generell schreibe ich eher keine Informationen in den Code, die in irgendeiner Weise abhängig vom Environment sind (Pfade zu Programmen, API-URLs usw.).

    In diesem Fall könnte das zum Problem werden, wenn du die venv verschiebst oder mit jemandem zusammenarbeitest, der sie woanders liegen hat, oder auf einem Produktionssystem die Pakete gar nicht in einer venv installiert werden, sondern im Systeminterpreter (durch apt). Wenn man aus irgendeinem Grund die venv nicht aktiviert werden kann (wir hatten das hier glaube ich mal mit systemd), würde ich eher den gewünschten Interpreter direkt aufrufen.


    Aus Sicht eines Hobbyprogrammierers würde ich aber sagen, dass das eine gute Idee ist, weils das Aufrufen der Scripts um einiges einfacher und schneller macht, und meistens teilt man seine Sachen nicht und benutzt sie nur auf wenigen Systemen

    Edited once, last by bennetr: Ups, da fehlte ein Teil :| (September 26, 2024 at 6:38 PM).

  • Wenn man aus irgendeinem Grund die venv nicht aktiviert werden kann

    Das wäre nahezu egal, darüber schreibe ich ja die ganze Zeit hier schon, aber natürlich kann man den Interpreter nach wie vor vor das Skript setzen. Es gibt bei Deinen Szenarien noch mehr Fallstricke, aber das nur am Rande. :wink1:


    BTW: Um es zu veranschaulichen hier mein Aufbau in Skripten.

    Wenn folgendes Skript ausführbar ist, kann ich es mit normalem Dateipfad von überall aus aufrufen, auch per Cronjob oder einer Service Unit.

    Python: /home/hyle/pythonvenv/test.py
    #!/home/hyle/pythonvenv/bin/python3
    
    <Code hier>

    oder

    Ich setze beim Aufruf den Interpreter vor das Skript: /home/hyle/pythonvenv/bin/python3 /home/hyle/pythonvenv/test.py, dann kann der Kollege den Pfad zu seinem venv-Interpreter davor setzen und ich kann weiter das Skript mit einfachem Dateipfad starten. :biggrin:

  • Seit vorigem Jahrtausend schreibe ich immer das zu verwendende Programm in den Shebang (/bin/sh; /bin/bash; /usr/bin/perl; /usr/bin/tclsh; ...)
    Das mit dem /usr/bin/env ist mir erst mit python untergekommen. Ich sah darin den Vorteil, falls mal wieder python nicht will, das man durch Manipulation des Environments eine ältere Version, so noch vorhanden, als Interpreter festlegen konnte. Das mit venv habe ich erst Anfang des Jahres mit bookworm kennengelernt. Ich würde ja auf python gern verzichten, aber viele Bibliotheken, die ich benötige, sind in python geschrieben. Muß ich mich halt durchquälen.

    Was natürlich klar ist, wenn man das/die Skript(e) weitergibt, das man den Interpreter angibt, womit das Skript lauffähig ist. Man sollte es halt nur nicht vergessen, da unschön.

    Ich denke, wenn ich das so interpretieren kann, sollte man im produktiven Betrieb den Interpreter mit Skript als Argument, aufrufen (da ist der Shebang eh nicht wirksam).
    Fürs basteln bin ich mir noch nicht schlüssig. Da wäre es aber zumindest eine Vereinfachung (weil ./skript gewohnt)

    Wenns ner net G'wittern tun tut.

  • FYI: Meine Aussage oben in #2 war falsch:

    Das Skript muss aber im Verzeichnis des venv liegen, damit die evtl. dort installierten Module gefunden werden. (//Edit: Das war Unsinn!)

    Nur damit das nicht unter geht. Das Skript kann auch liegen wo es will. Die im venv installierten Module werden trotzdem gefunden.

Participate now!

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