installation in venv von git funktioniert nicht, shebangs bleiben gleich

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
49846
User
Beiträge: 2
Registriert: Mittwoch 8. Februar 2023, 16:14

Moin,
ich schreib zur Reproduktion mal den relevanten Code rein:

Code: Alles auswählen

sudo mkdir /opt/mcrit
sudo chown $USER:$USER /opt/mcrit

sudo apt install git python3-pip python3.8-venv -y

cd /opt
git clone https://github.com/danielplohmann/mcrit.git
cd mcrit

python3 -m venv env
source env/bin/activate
python3 -m pip install --upgrade pip
python3 -m pip install wheel
pip install -r requirements.txt
python3 -m pip install -e .
deactivate
Wenn man nun sich den shebang mittels

Code: Alles auswählen

head /opt/mcrit/mcrit/Worker.py
anguckt, sieht man, der shebang wurde nicht überschrieben:
--> #!/usr/bin/env python3

Erwartet (oder mir erhofft) hätte ich:
--> #!/opt/mcrit/env/bin/python3

Meine zwei Fragen dazu:

1. Ist es nicht so, dass eigentlich die Shebangs auf die venv gehardcoded werden (überschrieben werden) bei der pip Installation in eine venv? So verstehe ich das hier:
You don’t specifically need to activate a virtual environment, as you can just specify the full path to that environment’s Python interpreter when invoking Python. Furthermore, all scripts installed in the environment should be runnable without activating it.

In order to achieve this, scripts installed into virtual environments have a “shebang” line which points to the environment’s Python interpreter, i.e. #!/<path-to-venv>/bin/python. This means that the script will run with that interpreter regardless of the value of PATH
Quelle: https://docs.python.org/3/library/venv. ... venvs-work

Warum passiert das hier nicht? Ähnliches habe ich übrigens auch mit pip install git+https://...

Code: Alles auswählen

head /opt/mcrit/env/lib/python3.8/site-packages/mcrit/Worker.py 
--> #!/usr/bin/env python3
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich verstehe nicht, woher die Erwartung kommt, ein venv würde irgendwie irgendwelche Skripte umschreiben. Das wäre katastrophal.

Es gibt drei Möglichkeiten: du kannst das venv aktivieren, und dann ist der shebang mit /usr/bin/env passend.

Wenn nicht, dann kannst du stattdessen (unter Ignoranz des shebang) einfach

/voller/Pfad/zum/venv/bin/Python /voller/Pfad/zum/Skript.py

benutzen.

Und zu guter letzt - und das sagt das Stück Text - eben diesen vollen Pfad als shebang selbst festlegen. Was ich nicht machen würde. Weil es eine Änderung von fremdem Code bedeutet, den man dann mitschleppt. Mein Weg wäre weg 2.
narpfel
User
Beiträge: 691
Registriert: Freitag 20. Oktober 2017, 16:10

all scripts installed in the environment should be runnable without activating it.
Du guckst dir kein in die venv installiertes Skript an, sondern ein Modul.

Skripte werden in `setup.py`/`setup.cfg` mittels `entry_points` festgelegt (hier als Beispiel, wie `pip` das macht) und bei der Installation automatisch im `bin`-Verzeichtnis der venv erstellt, z. B. so:

Code: Alles auswählen

#!/tmp/venv/bin/python
# -*- coding: utf-8 -*-
import re
import sys
from pip._internal.cli.main import main
if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
    sys.exit(main())
Wie man sieht, steht da der richtige Interpreter.

Dein Repo hat keine `entry_points`, also auch keine Skripte.
49846
User
Beiträge: 2
Registriert: Mittwoch 8. Februar 2023, 16:14

narpfel hat geschrieben: Freitag 10. Februar 2023, 18:17 Du guckst dir kein in die venv installiertes Skript an, sondern ein Modul.

Skripte werden in `setup.py`/`setup.cfg` mittels `entry_points` festgelegt (hier als Beispiel, wie `pip` das macht) und bei der Installation automatisch im `bin`-Verzeichtnis der venv erstellt, z. B. so:

Code: Alles auswählen

#!/tmp/venv/bin/python
...
Wie man sieht, steht da der richtige Interpreter.
Ah, alles klar - ja, das ist genau das, was ich mit einem anderen Github Projekt so erfahren hatte. Ich hab aber erst jetzt gesehen, dass die .py files in /bin der venv gar nicht vorher im Github drin waren ( --> somit auch nicht in der shebang "überschrieben" wurden), sondern dort erst generiert wurden (gleich mit passender shebang). Das erklärt jetzt einiges.

Aber ... wie gehe ich jetzt in diesem Fall damit um?
Also wie kann ich das / die Modul/e von diesem mccrit Github nun in die venv so installieren, dass sie mit dem richtigen Interpreter aufgerufen werden?
Falls das nicht geht: Wie rufe ich dann das Modul korrekt auf?

Bisher kriege ich es nur hin, wenn ich ins passende Verzeichnis cd'e und den richtigen Interpreter für Python angebe, also so:

Code: Alles auswählen

bla@bla-pc:/opt/mcrit/env/mcrit$ /opt/mcrit/env/bin/python3 -m mcrit worker
Wie könnte ich das modul finden, wenn ich aus ~ komme?
Denn

Code: Alles auswählen

bla@bla-pc:~$ /opt/mcrit/env/bin/python3 -m /opt/mcrit/env/mcrit worker
funktioniert nicht.

Da sagt er: No module named /opt/mcrit/env/mcrit

Vielen Dank schon mal!
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Du mußt halt die setup.py reparieren (fehlenden entry_points hinzufügen), so dass die richtigen Dateien automatisch im bin-Verzeichnis angelegt werden.
narpfel
User
Beiträge: 691
Registriert: Freitag 20. Oktober 2017, 16:10

49846 hat geschrieben: Montag 13. Februar 2023, 10:31

Code: Alles auswählen

bla@bla-pc:/opt/mcrit/env/mcrit$ /opt/mcrit/env/bin/python3 -m mcrit worker
Das sollte eigentlich unabhängig vom Arbeitsverzeichnis funktionieren.

Oder halt einfach einen PR schreiben, der die passenden `entry_points` ergänzt.
Antworten