Comment quitter / quitter / désactiver un virtualenv Python

1607

J'utilise virtualenv et virtualenvwrapper. Je peux très bien basculer entre virtualenv en utilisant la workoncommande.

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

Comment quitter toutes les machines virtuelles et travailler à nouveau sur ma vraie machine? À l'heure actuelle, la seule façon de revenir me@mymachine:~$est de quitter le shell et d'en démarrer un nouveau. C'est assez ennuyeux. Existe-t-il une commande pour travailler sur "rien", et si oui, qu'est-ce que c'est? Si une telle commande n'existe pas, comment pourrais-je procéder pour la créer?

Apreche
la source
5
Il y a une commande pour travailler sur "rien" - elle affiche tous vos environnements virtuels disponibles, ce qui est assez astucieux. Tapez simplement "workon" sans arguments et appuyez sur Entrée. La commande de quitter est "désactiver", comme indiqué ci-dessous.
Dannid

Réponses:

2596

Habituellement, l'activation d'un virtualenv vous donne une fonction shell nommée:

$ deactivate

ce qui ramène les choses à la normale.

Je viens de regarder spécifiquement à nouveau le code pour virtualenvwrapper, et, oui, il prend également en charge deactivatecomme moyen d'échapper à tous les virtualenvs.

Si vous essayez de quitter un environnement Anaconda , la commande dépend de votre version de conda. Les versions récentes (comme 4.6) installent une condafonction directement dans votre shell, auquel cas vous exécutez:

conda deactivate

Les anciennes versions de conda implémentent plutôt la désactivation à l'aide d'un script autonome:

source deactivate
Brandon Rhodes
la source
126
La commande «désactiver» n'est pas un binaire, ni un script que vous «sourcez»; c'est un alias de shell qui est défini dynamiquement dans votre shell actuel par le script "activate".
Brandon Rhodes
6
@Apreche Dans l'intervalle (près de quatre ans plus tard), cela semble avoir été ajouté à la documentation.
gertvdijk
6
Ce serait beaucoup plus intuitif s'il était appelé "workoff" ou "unworkon". Ou si "workon" était appelé "activer". Dieu merci pour l'alias.
kkurian
4
@kkurian - vous devriez suggérer que sur le tracker de problème pour virtualenvwrapperet peut-être que Doug Hellmann le considérerait! Notez, pour ceux qui pourraient lire ces commentaires plus tard, que ce workonn'est PAS une virtualenvcommande native (ce qui est le sujet de la question d'origine) mais une virtualenvwrappercommande!
Brandon Rhodes
17
Devinez comment s'appelle la commande virtualenv réelle à l'intérieur de "workon"? ... (avertissement spoiler) ... ... (avertissement spoiler) ... ... (avertissement spoiler) ... ... (avertissement spoiler) ... activer!
FutureNerd
53

J'ai défini un alias , workoff , comme l'opposé de workon :

alias workoff='deactivate'

Il est facile de se souvenir:

[bobstein@host ~]$ workon django_project
(django_project)[bobstein@host ~]$ workoff
[bobstein@host ~]$
Bob Stein
la source
1
Dans quel dossier? .bashrc?
seyed
@seyed oui, voir cette réponse pour un exemple d'alias dans~/.bashrc
Bob Stein
21
J'aime cet alias. Me rappelle le Karaté Kid (waxon; waxoff)
C0deH4cker
@ C0deH4cker: Je me suis connecté à SO et suis revenu à cette question juste pour +1 votre commentaire: p
pooley1994
lol je pensais (clap-on; clap-off). Je suppose que nous pourrions également inclure (jerk--)
Edison
53

Utilisation:

$ deactivate 

Si cela ne fonctionne pas, essayez

$ source deactivate

Quiconque sait comment fonctionne Bashsource pensera que c'est étrange, mais certains wrappers / workflows autour de virtualenv l'implémentent en complément / contrepartie source activate. Votre kilométrage peut varier.

DarkRider
la source
7
deactivateest une fonction qui est créée lorsque vous sourcez le activatefichier. Votre suggestion de faire source deactivaten'a aucun sens, car il n'y a pas de fichier nommédeactivate
Anthon
7
Cela ne mérite pas les downvotes. Voir modification de la réponse sélectionnée: la désactivation de la source concerne l'environnement anaconda.
Doug Bradshaw
2
Il "mérite" des downvotes pour ne pas répondre aux normes de qualité de réponse SO . C'est plus un commentaire qu'une réponse. Mais, en raison de la 79 réputation de l'affiche, nous devons être gentils et donner de bons commentaires.
Bruno Bronosky
@Abdul J'ai démontré comment vous pouvez améliorer la qualité de vos réponses dans la révision 2 sur stackoverflow.com/posts/29586756/revisions
Bruno Bronosky
cela est très inutile si vous n'avez pas de commande de désactivation dans votre shell. Je ne comprends pas vraiment pourquoi cela résoudrait le problème. Il n'y a pas de script de désactivation dans l'environnement virtuel.
bgenchel
19

Pour activer un environnement virtuel Python:

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

Pour désactiver:

$deactivate
Amitesh Ranjan
la source
3
Dans le terminal sur OS X10.11.1, je semble avoir à utiliser:$source activate
Eric Milliot-Martinez
Je n'avais pas besoin de source. Je l'ai fait $cd /to/dir/i/want/my/virtualenv/installedalors $virtualenv name_i_want_for_itpuis $. name_i_want_for_it/bin/activatevirtualenv me semble encore un peu éteint. A besoin d'être amélioré ...
uchuugaka
3
"source" est identique à "." commande .. soit peut être utilisé pour source un fichier
Corey Goldberg
11

J'ai découvert que dans un environnement Miniconda3, je devais exécuter:

conda deactivate

Ni deactivateni source deactivatetravaillé pour moi.

CephBirk
la source
1
deactivateétait pour virtualenv, et source deactivateest pour les anciens conda sous Linux. conda deactivateest un bon moyen multiplateforme pour les conda envs (pas virtualenvs)
Tomasz Gandor
6

Vous pouvez utiliser virtualenvwrapperafin de faciliter la façon dont vous travaillez virtualenv.

Installation virtualenvwrapper:

pip install virtualenvwrapper

Si vous utilisez un shell standard, ouvrez votre ~/.bashrcou ~/.zshrcsi vous utilisez Oh My Zsh . Ajoutez ces deux lignes:

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

Pour activer un virtualenv existant, utilisez la commande workon:

$ workon myenv
(myenv)$

Afin de désactiver votre virtualenv:

(myenv)$ deactivate

Voici mon tutoriel , étape par étape sur la façon d'installer virtualenv et virtualenvwrapper.

levi
la source
2
Je vois peu de différence par rapport à virtualenv intégré
Nam G VU
1
@NamGVU Remarquez la workoncommande, elle fonctionne depuis n'importe quel répertoire.
igaurav
1
Comme mentionné dans le commentaire d'un autre article (et Stackoverflow n'a pas de moyen pratique de le pointer), vous ne pouvez pas l'utiliser deactivatedans un script shell sans avoir préalablement sourcé le script qui définit cette fonction (dans ce cas, vous n'aurez pas trouvé cette commande.) . error)
Mariano Ruiz
4

Étant donné que la deactivatefonction créée par l'approvisionnement ~/bin/activatene peut pas être découverte par les moyens habituels de recherche d'une telle commande dans ~/bin, vous pouvez en créer une qui exécute simplement la fonction deactivate.

Le problème est qu'un script nommé deactivatecontenant une seule commande deactivateprovoquera une boucle sans fin s'il est exécuté accidentellement alors qu'il n'est pas dans le venv. Une erreur courante.

Cela peut être évité en n'exécutant que deactivatesi la fonction existe (c'est-à-dire qu'elle a été créée par sourcing activate).

#!/bin/bash

declare -Ff deactivate  && deactivate
DocSalvager
la source
3

Utilisez deactivate.

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

Remarque, (my_env)est parti.

Règles de base
la source
2

J'utilise zsh-autoenv qui est basé sur autoenv .

zsh-autoenv source automatiquement les fichiers (connus / sur liste blanche) .autoenv.zsh, généralement utilisés dans les répertoires racine du projet. Il gère les événements "entrée" et sortie ", l'imbrication et le stockage des variables (écrasement et restauration).

Voici un exemple:

; 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

Ainsi, lorsque je quitte le dtreerépertoire, l'environnement virtuel se ferme automatiquement.

"Development tree utiles" est juste un nom… Aucun moyen caché de lien avec les Illuminati ici.

Sardathrion - contre les abus SE
la source
1

L'utilisation de la deactivatefonctionnalité fournie par le script du venv activatenécessite que vous fassiez confiance à la fonction de désactivation pour être correctement codée afin de réinitialiser proprement toutes les variables d'environnement à leur état antérieur, en tenant compte non seulement de l' activation d'origine , mais également de tous les commutateurs , configurations ou autres travail que vous avez peut-être fait entre-temps.

C'est probablement bien, mais cela introduit un nouveau risque non nul de laisser votre environnement modifié par la suite.

Cependant, il n'est pas techniquement possible qu'un processus modifie directement les variables d'environnement de son parent, nous pouvons donc utiliser un sous-shell séparé pour être absolument sûr que nos venvs ne laissent aucun changement résiduel derrière:


Activer:

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

  • Cela démarre un nouveau shell autour du venv. Votre bashcoque d' origine reste inchangée.

Pour désactiver:

$ exitOU [CTRL]+[D]

  • Cela quitte l'intégralité du shell venvdans lequel il se trouve et vous ramène au shell d'origine avant que le script d'activation n'apporte de modifications à l'environnement.

Exemple:

[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
la source
-1

J'ai eu le même problème en travaillant sur un script d'installation. J'ai regardé ce que le bin / activate_this.py a fait et je l'ai inversé.

Exemple:

#! /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())

Je ne suis pas sûr à 100% si cela fonctionne comme prévu. J'ai peut-être complètement raté quelque chose.

Lord Sumner
la source
2
si la désactivation réinitialise la valeur du chemin de l'environnement, du chemin du système, de l'invite par défaut, votre fonction de désactivation est une bonne approche. J'aime ton script. Déjà donné +1.
Ramkumar D du