it-swarm.com.de

Wie kann man die Virtualenv-Quelle in einem Bash-Skript aktivieren?

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 Virtualenv aktivieren durch:

[email protected]:src$ . ../.env/bin/activate
(.env)[email protected]:src$

Wenn Sie dasselbe von einem Bash-Skript aus tun, wird jedoch nichts unternommen:

[email protected]:src$ cat Shell.sh
#!/bin/bash
. ../.env/bin/activate
[email protected]:src$ ./Shell.sh
[email protected]:src$ 

Was mache ich falsch?

65
Cerin

Wenn Sie die Quelle aufrufen, 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 fertig ist und Sie zu Ihrer ursprünglichen, nicht aktivierten Shell zurückkehren.

Die beste Option wäre, es in einer Funktion auszuführen

activate () {
  . ../.env/bin/activate
}

oder ein Alias

alias activate=". ../.env/bin/activate"

Hoffe das hilft.

49
richo

Sie sollten das Bash-Skript mit source aufrufen.

Hier ist ein Beispiel:

#!/bin/bash
# Let's call this script venv.sh
source "<absolute_path_recommended_here>/.env/bin/activate"

Auf Ihrer Shell nennen Sie es einfach so:

> source venv.sh

Oder als @ outmind empfohlen:

> . venv.sh

Nun geht es los, die Shell-Angabe wird auf Ihrer Eingabeaufforderung platziert.

39
Flavio Garcia

Obwohl das Präfix "(.env)" der Shell-Eingabeaufforderung nicht hinzugefügt wird, fand ich, dass dieses Skript wie erwartet funktioniert.

#!/bin/bash
script_dir=`dirname $0`
cd $script_dir
/bin/bash -c ". ../.env/bin/activate; exec /bin/bash -i"

z.B.

[email protected]:~/src$ which pip
/usr/local/bin/pip
[email protected]:~/src$ which python
/usr/bin/python
[email protected]:~/src$ ./Shell
[email protected]:~/src$ which pip
~/.env/bin/pip
[email protected]:~/src$ which python
~/.env/bin/python
[email protected]:~/src$ exit
exit
13
Cerin

Sourcing führt Shell-Befehle in Ihrer aktuellen Shell aus. Wenn Sie in einem Skript wie oben beschrieben quellen, wirkt sich dies auf die Umgebung für dieses Skript aus. Wenn das Skript jedoch beendet wird, werden die Umgebungsänderungen rückgängig gemacht, da sie tatsächlich den Gültigkeitsbereich verlassen.

Wenn Sie Shell-Befehle in der virtuellen Umgebung ausführen möchten, können Sie dies in Ihrem Skript nach dem Aktivieren des Aktivierungsskripts tun. Wenn Sie mit einer Shell in der virtuellen Umgebung interagieren möchten, können Sie eine Sub-Shell in Ihrem Skript erzeugen, die die Umgebung erbt.

8
zigg

Hier ist das Skript, das ich oft benutze

#!/bin/bash -x
PWD=`pwd`
/usr/local/bin/virtualenv --python=python3 venv
echo $PWD
activate () {
    . $PWD/venv/bin/activate
}

activate
0
Sand1512

Sie können dies auch mit einer Subshell tun, um Ihre Verwendung besser einzuschränken - hier ein praktisches Beispiel:

#!/bin/bash

commandA --args

# Run commandB in a subshell and collect its output in $VAR
VAR=$(
    PATH=$PATH:/opt/bin
    . /path/to/activate > /dev/null
    commandB  # tool from /opt/bin that requires virtualenv
)

# Use the output of the commandB later
commandC "${VAR}"

Dieser Stil ist besonders hilfreich, wenn

  • commandA oder commandB existieren in /opt/bin
  • diese Befehle schlagen unter der Virtualenv fehl
  • sie benötigen eine Vielzahl verschiedener Virtualenvs
0
ti7

Wofür benötigt man das bash-Skript?

  1. Haben Sie virtualenvwrapper ausprobiert, wenn Sie zwischen mehreren Virtualenvs wechseln oder schnell eine Virtualenv eingeben möchten? Es bietet viele Hilfsmittel wie workon venv, mkvirtualenv venv und so weiter.

  2. Wenn Sie in bestimmten virtuellen Umgebungen ein Python-Skript ausführen, verwenden Sie /path/to/venv/bin/python script.py, um es auszuführen.

0
iMom0

Sie sollten mehrere Befehle in einer Zeile verwenden. zum Beispiel:

os.system(". Projects/virenv/bin/activate && python Projects/virenv/Django-project/manage.py runserver")

wenn Sie Ihre virtuelle Umgebung in einer Zeile aktivieren, werden meines Erachtens andere Befehlszeilen nicht berücksichtigt, und Sie können dies verhindern, indem Sie mehrere Befehle in einer Zeile verwenden. Es hat bei mir funktioniert :)