Wie erstellt man ein Bash-Skript, um eine Python-Virtualenv zu aktivieren?
Ich habe eine Verzeichnisstruktur wie:
.env
bin
activate
...other virtualenv files...
src
shell.sh
...my code...
Ich kann meine virtuelle Umgebung aktivieren durch:
user@localhost:src$ . ../.env/bin/activate
(.env)user@localhost:src$
Dasselbe mit einem Bash-Skript zu tun, bewirkt jedoch nichts:
user@localhost:src$ cat shell.sh
#!/bin/bash
. ../.env/bin/activate
user@localhost:src$ ./shell.sh
user@localhost:src$
Was mache ich falsch?
python
bash
virtualenv
Cerin
quelle
quelle
source
besteht darin, etwas in der aktuellen Shell zu ändern. Sie können die Python des virtualenv über den vollständigen Pfad verwenden./env/bin/python
.Antworten:
Wenn Sie eine Quelle erstellen, laden Sie das Aktivierungsskript in Ihre aktive Shell.
Wenn Sie dies in einem Skript tun, laden Sie es in die Shell, die beendet wird, wenn Ihr Skript beendet ist und Sie zu Ihrer ursprünglichen, nicht aktivierten Shell zurückkehren.
Ihre beste Option wäre, dies in einer Funktion zu tun
oder ein Alias
Hoffe das hilft.
quelle
Sie sollten das Bash-Skript mit source aufrufen.
Hier ist ein Beispiel:
Nennen Sie es auf Ihrer Shell einfach so:
Oder wie von @outmind vorgeschlagen: (Beachten Sie, dass dies mit zsh nicht funktioniert.)
Los geht's, die Shell-Anzeige wird auf Ihrer Eingabeaufforderung platziert.
quelle
source "/home/surest/Desktop/testservers/TEST_VENV/venv3/bin/activate"
erzeugt:/home/surest/Desktop/testservers/TEST_VENV/py3.sh: 10: /home/surest/Desktop/testservers/TEST_VENV/py3.sh: source: not found
which source
an einer Shell-Eingabeaufforderungsource venv3/bin/activate
tippe , aber das tue, was ich erwarte und das Venv öffne. ...source ./env/bin/activate
(mit demselben#!/bin/bash
Präfix) nicht? Was ist der Unterschied zwischen der Verwendung von Anführungszeichen und nicht?source ./env/bin/activate
weil dies relativ zu dem Pfad ist, den Sie laufen, oder? Wenn Sie das Verzeichnis innerhalb des Skripts ändern, können Sie relativ werden.Obwohl das Präfix "(.env)" nicht zur Shell-Eingabeaufforderung hinzugefügt wird, hat dieses Skript wie erwartet funktioniert.
z.B
quelle
/bin/bash
zu/usr/bin/env bash
deactivate
aus der Subshell mitexit
oder Strg + dBeim Sourcing werden Shell-Befehle in Ihrer aktuellen Shell ausgeführt. Wenn Sie innerhalb eines Skripts wie oben beschrieben eine Quelle erstellen, wirkt sich dies auf die Umgebung dieses Skripts aus. Wenn das Skript jedoch beendet wird, werden die Umgebungsänderungen rückgängig gemacht, da sie praktisch außerhalb des Gültigkeitsbereichs liegen.
Wenn Sie Shell-Befehle in der virtuellen Umgebung ausführen möchten, können Sie dies in Ihrem Skript tun, nachdem Sie das Aktivierungsskript bezogen haben. Wenn Sie mit einer Shell innerhalb der virtuellen Umgebung interagieren möchten, können Sie eine Sub-Shell in Ihrem Skript erzeugen, die die Umgebung erben würde.
quelle
Hier ist das Skript, das ich oft benutze. Führen Sie es als
$ source script_name
quelle
Wofür dient die Beschaffung des Bash-Skripts?
Wenn Sie beabsichtigen, zwischen mehreren virtuellen Umgebungen zu wechseln oder schnell eine virtuelle Umgebung einzugeben, haben Sie es versucht
virtualenvwrapper
? Es bietet eine Menge utils wieworkon venv
,mkvirtualenv venv
und so weiter.Wenn Sie nur ein Python-Skript in einer bestimmten virtuellen Umgebung ausführen, verwenden Sie es
/path/to/venv/bin/python script.py
, um es auszuführen.quelle
workon ...
von einem Bash-Skript aus aufrufen . (Weil ich jedes Mal beim Start weitere Dinge ausführen möchte.) Ich kann jedoch keinen Weg finden, es zum Laufen zu bringen.Sie können dies auch mit einer Unterschale tun, um Ihre Verwendung besser einzudämmen - hier ein praktisches Beispiel:
Dieser Stil ist besonders hilfreich, wenn
commandA
odercommandC
existiert unter/opt/bin
commandB
existiert im SystemPATH
oder ist sehr verbreitetquelle
$(...)
sonst Leerzeichen und Tabulatoren in der Ausgabe fehlen."${VAR}"
ist genau gleichbedeutend damit, dass"$VAR"
Sie keine geschweiften Klammern um Shell-Variablen benötigen, da doppelte Anführungszeichen tatsächlich leistungsfähiger sind. Die Ausnahme ist bei der Verwendung von Modifikatoren zum Beispiel mag"${VAR:-default_value}"
PATH=$PATH:/opt/bin
benötigt korrekte Anführungszeichen, um Pfade mit Leerzeichen und Tabulatoren zu behandeln.edit
Button unter den Posts verwenden kannst , um Änderungen an ihnen vorzuschlagen! Lassen Sie uns außerdem wissen, dass jeder, der wissentlichIFS
Zeichen hinzufügt ,PATH
ein Terrorist ist, obwohl dies häufig eine Anforderung und wichtig für die Sicherheit ist.Sie sollten mehrere Befehle in einer Zeile verwenden. beispielsweise:
Wenn Sie Ihre virtuelle Umgebung in einer Zeile aktivieren, werden andere Befehlszeilen vergessen, und Sie können dies verhindern, indem Sie mehrere Befehle in einer Zeile verwenden. Es hat bei mir funktioniert :)
quelle
Als ich venv lernte, erstellte ich ein Skript, um mich daran zu erinnern, wie man es aktiviert.
Dies hat den Vorteil, dass die Eingabeaufforderung geändert wird.
quelle