So verlassen / beenden / deaktivieren Sie eine Python-Virtualenv

1607

Ich benutze virtualenv und den virtualenvwrapper. Mit dem workonBefehl kann ich problemlos zwischen virtualenv wechseln .

me@mymachine:~$ workon env1
(env1)me@mymachine:~$ workon env2
(env2)me@mymachine:~$ workon env1
(env1)me@mymachine:~$ 

Wie beende ich alle virtuellen Maschinen und arbeite wieder an meiner realen Maschine? Im Moment kann ich nur zurückkehren, indem ich me@mymachine:~$die Shell verlasse und eine neue starte. Das ist irgendwie nervig. Gibt es einen Befehl, an "nichts" zu arbeiten, und wenn ja, was ist das? Wenn ein solcher Befehl nicht existiert, wie würde ich ihn erstellen?

Apreche
quelle
5
Es gibt einen Befehl, mit "nichts" zu arbeiten - er zeigt alle verfügbaren virtuellen Umgebungen an, was ziemlich geschickt ist. Geben Sie einfach "workon" ohne Argumente ein und drücken Sie die Eingabetaste. Der Befehl zum Verlassen lautet "Deaktivieren", wie unten beantwortet.
Dannid

Antworten:

2595

Wenn Sie eine virtuelle Umgebung aktivieren, erhalten Sie normalerweise eine Shell-Funktion mit dem Namen:

$ deactivate

was die Dinge wieder normalisiert.

Ich habe mir gerade noch einmal den Code genauer angesehen virtualenvwrapper, und ja, er unterstützt deactivateauch den Weg, um allen virtuellen Umgebungen zu entkommen.

Wenn Sie versuchen, eine Anaconda- Umgebung zu verlassen , hängt der Befehl von Ihrer Version von ab conda. Neuere Versionen (wie 4.6) installieren eine condaFunktion direkt in Ihrer Shell. In diesem Fall führen Sie Folgendes aus:

conda deactivate

Ältere Conda-Versionen implementieren stattdessen die Deaktivierung mithilfe eines eigenständigen Skripts:

source deactivate
Brandon Rhodes
quelle
126
Der Befehl "Deaktivieren" ist weder eine Binärdatei noch ein Skript, das Sie "quellen". Es handelt sich um einen Shell-Alias, der in Ihrer aktuellen Shell durch das Skript "Aktivieren" dynamisch definiert wird.
Brandon Rhodes
6
@Apreche In der Zwischenzeit (fast vier Jahre später) scheint dies der Dokumentation hinzugefügt worden zu sein.
Gertvdijk
6
Wäre viel intuitiver, wenn es "Workoff" oder "Unworkon" genannt würde. Oder wenn "workon" als "enable" bezeichnet wurde. Gott sei Dank für Alias.
kkurian
4
@kkurian - du solltest vorschlagen, dass auf dem Issue-Tracker für virtualenvwrapperund vielleicht Doug Hellmann es in Betracht ziehen würde! Hinweis für diejenigen , die später diese Kommentare lesen könnten, dass workonist nicht ein native virtualenvBefehl (das ist , was die ursprüngliche Frage ist etwa) , sondern ein virtualenvwrapperBefehl!
Brandon Rhodes
17
Ratet mal, wie der eigentliche virtualenv-Befehl in "workon" heißt? ... (Spoilerwarnung) ... ... (Spoilerwarnung) ... ... (Spoilerwarnung) ... ... (Spoilerwarnung) ... aktivieren!
FutureNerd
53

Ich habe einen Alias , Workoff , als das Gegenteil von Workon definiert :

alias workoff='deactivate'

Es ist leicht zu merken:

[bobstein@host ~]$ workon django_project
(django_project)[bobstein@host ~]$ workoff
[bobstein@host ~]$
Bob Stein
quelle
1
In welcher Datei? .bashrc?
Seyed
@seyed ja, sehen Sie diese Antwort für ein Beispiel des Alias ​​in~/.bashrc
Bob Stein
21
Ich mag diesen Alias. Erinnert mich an das Karate Kid (Waxon; Waxoff)
C0deH4cker
@ C0deH4cker: Ich habe mich bei SO angemeldet und bin auf diese Frage zurückgekommen, nur um +1 Ihren Kommentar
abzugeben
lol Ich dachte (klatschen an; klatschen). Ich denke, wir könnten auch (jerk--)
Edison
53

Verwenden:

$ deactivate 

Wenn dies nicht funktioniert, versuchen Sie es

$ source deactivate

Jeder, der weiß, wie Bashsource funktioniert, wird das seltsam finden, aber einige Wrapper / Workflows rund um virtualenv implementieren es als Ergänzung / Gegenstück zu source activate. Ihr Kilometerstand kann variieren.

Dunkler Reiter
quelle
7
deactivateist eine Funktion, die erstellt wird, wenn Sie die activateDatei als Quelle verwenden. Ihr Vorschlag macht source deactivateüberhaupt keinen Sinn, da es keine Datei mit dem Namendeactivate
Anthon
7
Dies verdient die Ablehnung nicht. Siehe Bearbeiten der ausgewählten Antwort: Deaktivieren der Quelle gilt für die Anaconda-Umgebung.
Doug Bradshaw
2
Es "verdient" Abstimmungen, weil es die Qualitätsstandards für SO- Antworten nicht erfüllt. Es ist eher ein Kommentar als eine Antwort. Aber wegen des guten Rufs des Plakats sollten wir nett sein und gutes Feedback geben.
Bruno Bronosky
@Abdul Ich habe gezeigt, wie Sie Ihre Antwortqualität
Bruno Bronosky
Dies ist sehr wenig hilfreich, wenn Sie keinen Deaktivierungsbefehl in Ihrer Shell haben. Ich verstehe nicht wirklich, warum dies dem Problem helfen würde. In der virtuellen Umgebung ist kein Skript zum Deaktivieren vorhanden.
Bgenchel
19

So aktivieren Sie eine virtuelle Python-Umgebung:

$cd ~/python-venv/
$./bin/activate

So deaktivieren Sie:

$deactivate
Amitesh Ranjan
quelle
3
Im Terminal unter OS X10.11.1 muss ich anscheinend Folgendes verwenden:$source activate
Eric Milliot-Martinez
Ich brauchte keine Quelle. Ich habe $cd /to/dir/i/want/my/virtualenv/installeddann $virtualenv name_i_want_for_itdann $. name_i_want_for_it/bin/activatevirtualenv scheint mir noch ein bisschen abwegig zu sein.
Muss
3
"source" ist dasselbe wie "." Befehl .. entweder kann verwendet werden, um eine Datei
Corey Goldberg
11

Ich stellte fest, dass ich in einer Miniconda3-Umgebung Folgendes ausführen musste:

conda deactivate

Weder deactivatenoch source deactivatefür mich gearbeitet.

CephBirk
quelle
1
deactivate war für virtualenv und source deactivateist für alte conda unter Linux. conda deactivateist ein guter plattformübergreifender Weg für Conda Envs (nicht Virtualenvs)
Tomasz Gandor
6

Sie können verwenden virtualenvwrapper, um die Arbeitsweise zu vereinfachen virtualenv.

Installation virtualenvwrapper:

pip install virtualenvwrapper

Wenn Sie eine Standard-Shell verwenden, öffnen Sie Ihre ~/.bashrcoder ~/.zshrcwenn Sie Oh My Zsh verwenden . Fügen Sie diese beiden Zeilen hinzu:

export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh

Verwenden Sie den folgenden Befehl, um eine vorhandene virtuelle Umgebung zu aktivieren workon:

$ workon myenv
(myenv)$

So deaktivieren Sie Ihre virtuelle Umgebung:

(myenv)$ deactivate

Hier ist mein Tutorial , Schritt für Schritt, wie man virtualenv und virtualenvwrapper installiert.

levi
quelle
2
Ich sehe wenig Unterschied zu eingebauter virtueller Umgebung
Nam G VU
1
@NamGVU Beachten Sie den workonBefehl, er funktioniert von jedem Verzeichnis aus.
Igaurav
1
Wie im Kommentar eines anderen Beitrags erwähnt (und Stackoverflow hat keine praktische Möglichkeit, darauf hinzuweisen), können Sie es nicht deactivatein einem Shell-Skript verwenden, ohne zuerst das Skript zu beziehen , das diese Funktion definiert (in diesem Fall wird dieser Befehl nicht gefunden.). . Fehler)
Mariano Ruiz
4

Da die deactivatedurch Sourcing erstellte Funktion ~/bin/activatenicht mit den üblichen Mitteln zum Suchen nach einem solchen Befehl erkannt werden ~/binkann, möchten Sie möglicherweise einen erstellen, der nur die Funktion ausführt deactivate.

Das Problem ist, dass ein Skript mit dem Namen deactivateeines einzelnen Befehls deactivateeine Endlosschleife verursacht, wenn es versehentlich ausgeführt wird, während es sich nicht im venv befindet. Ein häufiger Fehler.

Dies kann vermieden werden, indem nur ausgeführt wird, deactivatewenn die Funktion vorhanden ist (dh durch Sourcing erstellt wurde activate).

#!/bin/bash

declare -Ff deactivate  && deactivate
DocSalvager
quelle
3

Verwenden Sie deactivate.

(my_env) user@user:~/my_env$ deactivate
user@user-Lenovo-E40-80:~/my_env$ 

Beachten Sie, (my_env)ist weg.

Grundregeln
quelle
2

Ich benutze zsh-autoenv, das auf autoenv basiert .

zsh-autoenv liefert automatisch .autoenv.zshDateien (bekannt / auf der Whitelist) , die normalerweise in Projektstammverzeichnissen verwendet werden. Es behandelt "Enter" - und Leave "-Ereignisse, das Verschachteln und Verstecken von Variablen (Überschreiben und Wiederherstellen).

Hier ist ein Beispiel:

; cd dtree 
Switching to virtual environment: Development tree utiles
;dtree(feature/task24|✓); cat .autoenv.zsh       
# Autoenv.
echo -n "Switching to virtual environment: "
printf "\e[38;5;93m%s\e[0m\n" "Development tree utiles"
workon dtree
# eof
dtree(feature/task24|✓); cat .autoenv_leave.zsh 
deactivate

Wenn ich das dtreeVerzeichnis verlasse , wird die virtuelle Umgebung automatisch beendet.

"Development tree utiles" ist nur ein Name ... Keine versteckte Verbindung zu den Illuminaten hier.

Sardathrion - gegen SE-Missbrauch
quelle
1

Wenn Sie die deactivateim venv- activateSkript bereitgestellte Funktion verwenden möchten, müssen Sie darauf vertrauen, dass die Deaktivierungsfunktion ordnungsgemäß codiert ist , um alle Umgebungsvariablen wieder auf den vorherigen Stand zu bringen. Dabei werden nicht nur die ursprüngliche Aktivierung , sondern auch alle Schalter , Konfigurationen oder andere Faktoren berücksichtigt Arbeit, die Sie vielleicht in der Zwischenzeit erledigt haben.

Es ist wahrscheinlich in Ordnung, aber es birgt ein neues Risiko ungleich Null, dass Ihre Umgebung danach geändert wird.

Es ist jedoch technisch nicht möglich, dass ein Prozess die Umgebungsvariablen seines übergeordneten Elements direkt ändert. Daher können wir eine separate Sub-Shell verwenden, um absolut sicherzugehen, dass unsere venvs keine verbleibenden Änderungen hinterlassen:


Aktivieren:

$ bash --init-file PythonVenv/bin/activate

  • Dies startet eine neue Shell um die venv. Ihre ursprüngliche bashHülle bleibt unverändert.

So deaktivieren Sie:

$ exitODER [CTRL]+[D]

  • Dadurch wird die gesamte Shell beendet, in der venvsich die Shell befindet, und Sie kehren zur ursprünglichen Shell zurück, bevor das Aktivierungsskript Änderungen an der Umgebung vorgenommen hat.

Beispiel:

[user@computer ~]$ echo $VIRTUAL_ENV
No virtualenv!

[user@computer ~]$ bash --init-file PythonVenv/bin/activate

(PythonVenv) [user@computer ~]$ echo $VIRTUAL_ENV
/home/user/PythonVenv

(PythonVenv) [user@computer ~]$ exit
exit

[user@computer ~]$ echo $VIRTUAL_ENV
No virtualenv!
Will Chen
quelle
-1

Ich hatte das gleiche Problem bei der Arbeit an einem Installationsskript. Ich habe mir angesehen, was die bin / activate_this.py ist hat und es umgekehrt.

Beispiel:

#! /usr/bin/python
# -*- coding: utf-8 -*-
import os
import sys

# Path to virtualenv
venv_path = os.path.join('/home', 'sixdays', '.virtualenvs', 'test32')

# Save old values
old_os_path = os.environ['PATH']
old_sys_path = list(sys.path)
old_sys_prefix = sys.prefix


def deactivate():
    # Change back by setting values to starting values
    os.environ['PATH'] = old_os_path
    sys.prefix = old_sys_prefix
    sys.path[:0] = old_sys_path


# Activate the virtualenvironment
activate_this = os.path.join(venv_path, 'bin/activate_this.py')
execfile(activate_this, dict(__file__=activate_this))


# Print list of pip packages for virtualenv for example purpose
import pip
print str(pip.get_installed_distributions())

# Unload pip module
del pip

# Deactivate/switch back to initial interpreter
deactivate()

# Print list of initial environment pip packages for example purpose
import pip
print str(pip.get_installed_distributions())

Ich bin nicht 100% sicher, ob es wie beabsichtigt funktioniert. Ich habe vielleicht etwas komplett verpasst.

Lord Sumner
quelle
2
Wenn durch Deaktivieren der Wert des Umgebungspfads, des Systempfads und der Standardaufforderung zurückgesetzt wird, ist Ihre Deaktivierungsfunktion ein guter Ansatz. Ich mag dein Drehbuch. Bereits +1 gegeben.
Ramkumar D