Cómo salir / salir / desactivar un Python virtualenv

1607

Estoy usando virtualenv y virtualenvwrapper. Puedo cambiar entre virtualenv bien usando el workoncomando.

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

¿Cómo salgo de todas las máquinas virtuales y vuelvo a trabajar en mi máquina real? En este momento, la única forma de volver me@mymachine:~$es salir del shell y comenzar uno nuevo. Eso es un poco molesto. ¿Hay un comando para trabajar en "nada", y si es así, qué es? Si tal comando no existe, ¿cómo haría para crearlo?

Apreche
fuente
55
Hay un comando para trabajar en "nada": muestra todos los entornos virtuales disponibles, lo cual es bastante ingenioso. Simplemente escriba "workon" sin argumentos y presione enter. El comando para salir es "desactivar", como se responde a continuación.
Dannid

Respuestas:

2596

Por lo general, activar un virtualenv le proporciona una función de shell llamada:

$ deactivate

lo que vuelve las cosas a la normalidad.

Acabo de mirar específicamente de nuevo el código virtualenvwrappery, sí, también es compatible deactivatecomo la forma de escapar de todos los virtualenvs.

Si está intentando abandonar un entorno de Anaconda , el comando depende de su versión de conda. Las versiones recientes (como 4.6) instalan una condafunción directamente en su shell, en cuyo caso ejecuta:

conda deactivate

En su lugar, las versiones anteriores de conda implementan la desactivación mediante un script independiente:

source deactivate
Brandon Rhodes
fuente
126
El comando "desactivar" no es un binario, ni un script que "fuente"; es un alias de shell que se define dinámicamente en su shell actual por el script "activar".
Brandon Rhodes
66
@Apreche Mientras tanto (casi cuatro años después) esto parece haberse agregado a la documentación.
gertvdijk
66
Sería mucho más intuitivo si se llamara "workoff" o "unworkon". O si "workon" se llamara "activar". Gracias a Dios por el alias.
kkurian
44
@kkurian: ¡debes sugerir que en el rastreador de problemas virtualenvwrappery quizás Doug Hellmann lo consideraría! Tenga en cuenta que, para aquellos que puedan leer estos comentarios más adelante, ¡ NOworkon es un comando nativo (que es de lo que trata la pregunta original) sino un comando! virtualenvvirtualenvwrapper
Brandon Rhodes
17
¿Adivina cómo se llama el comando virtualenv real dentro de "workon"? ... (advertencia de spoiler) ... ... (advertencia de spoiler) ... ... (advertencia de spoiler) ... ... (advertencia de spoiler) ... ¡activar!
FutureNerd
53

Definí un alias , workoff , como lo contrario de workon :

alias workoff='deactivate'

Es fácil de recordar:

[bobstein@host ~]$ workon django_project
(django_project)[bobstein@host ~]$ workoff
[bobstein@host ~]$
Bob Stein
fuente
1
En que archivo? .bashrc?
visto el
@seyed yes, mira esta respuesta para ver un ejemplo de alias en~/.bashrc
Bob Stein
21
Me gusta este alias. Me recuerda al Karate Kid (waxon; waxoff)
C0deH4cker
@ C0deH4cker: Ingresé en SO y volví a esta pregunta solo para hacer +1 en su comentario: p
pooley1994
jaja estaba pensando (clap-on; clap-off). Supongo que también podríamos incluir (idiota)
Edison
53

Utilizar:

$ deactivate 

Si esto no funciona, intente

$ source deactivate

Cualquiera que sepa cómo funciona Bashsource pensará que es extraño, pero algunos envoltorios / flujos de trabajo en torno a virtualenv lo implementan como complemento / contraparte de source activate. Su experiencia puede ser diferente.

Jinete Oscuro
fuente
77
deactivatees una función que se crea cuando se obtiene el activatearchivo. Su sugerencia para hacer source deactivateno tiene ningún sentido, ya que no hay ningún archivo llamadodeactivate
Anthon
77
Esto no merece los votos negativos. Vea la edición de la respuesta seleccionada: la desactivación de la fuente es para el entorno anaconda.
Doug Bradshaw
2
"Merece" votos negativos por no cumplir con los estándares de calidad de respuesta SO . Es más un comentario que una respuesta. Pero, debido a la reputación del cartel, debemos ser amables y dar buenos comentarios.
Bruno Bronosky
@ Abdul He demostrado cómo puede mejorar la calidad de su respuesta en la Revisión 2 en stackoverflow.com/posts/29586756/revisions
Bruno Bronosky
Esto es muy inútil si no tiene un comando de desactivación en su shell. Realmente no entiendo por qué esto ayudaría al problema. No hay script de desactivación en el entorno virtual.
bgenchel
19

Para activar un entorno virtual de Python:

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

Para desactivar:

$deactivate
Amitesh Ranjan
fuente
3
En la terminal en OS X10.11.1, parece que tengo que usar:$source activate
Eric Milliot-Martinez
No necesitaba fuente. Lo hice $cd /to/dir/i/want/my/virtualenv/installedentonces, $virtualenv name_i_want_for_itentonces $. name_i_want_for_it/bin/activatevirtualenv todavía me parece un poco desagradable. Necesita ser mejorado ...
uchuugaka
3
"fuente" es lo mismo que "." comando .. cualquiera puede usarse para obtener un archivo
Corey Goldberg
11

Descubrí que cuando estaba en un entorno Miniconda3 tenía que ejecutar:

conda deactivate

Ni deactivatetampoco source deactivatetrabajó para mí.

CephBirk
fuente
1
deactivatefue para virtualenvy source deactivatees para conda antiguo en Linux. conda deactivatees una buena forma multiplataforma para conda envs (no virtualenvs)
Tomasz Gandor
6

Puede usar virtualenvwrapperpara facilitar la forma en que trabaja virtualenv.

Instalando virtualenvwrapper:

pip install virtualenvwrapper

Si está utilizando un shell estándar, abra su ~/.bashrco ~/.zshrcsi usa Oh My Zsh . Agregue estas dos líneas:

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

Para activar un virtualenv existente, use el comando workon:

$ workon myenv
(myenv)$

Para desactivar su virtualenv:

(myenv)$ deactivate

Aquí está mi tutorial , paso a paso sobre cómo instalar virtualenv y virtualenvwrapper.

levi
fuente
2
Veo poca diferencia en comparación con el virtualenv incorporado
Nam G VU del
1
@NamGVU Observe el workoncomando, funciona desde cualquier directorio.
igaurav
1
Como se mencionó en el comentario de otra publicación (y Stackoverflow no tiene una forma práctica de señalarlo), no se puede usar deactivateen un script de shell sin primero obtener el script que define esta función (en ese caso, tendrá ese comando no encontrado ... . error)
Mariano Ruiz
4

Dado que la deactivatefunción creada por el abastecimiento ~/bin/activateno puede ser descubierta por los medios habituales de buscar dicho comando ~/bin, es posible que desee crear uno que simplemente ejecute la funcióndeactivate .

El problema es que un script llamado deactivatecontiene un solo comandodeactivate causará un bucle sin fin si se ejecuta accidentalmente mientras no está en el venv. Un error común.

Esto se puede evitar ejecutando solo deactivatesi la función existe (es decir, se ha creado mediante el abastecimiento activate).

#!/bin/bash

declare -Ff deactivate  && deactivate
DocSalvager
fuente
3

Uso deactivate.

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

Nota, (my_env)se ha ido.

Reglas Basant
fuente
2

Yo uso zsh-autoenv que se basa en autoenv .

zsh-autoenv obtiene automáticamente los archivos (conocidos / incluidos en la lista blanca) .autoenv.zsh, generalmente utilizados en los directorios raíz del proyecto. Maneja los eventos "enter" y leave ", anidamiento y almacenamiento de variables (sobrescritura y restauración).

Aquí hay un ejemplo:

; 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

Entonces, cuando salgo del dtreedirectorio, el entorno virtual se cierra automáticamente.

"Development tree utiles" es solo un nombre ... No hay un medio oculto que se vincule con los Illuminati aquí.

Sardathrion - contra el abuso SE
fuente
1

El uso de la deactivatefunción proporcionada por el script de venv activaterequiere que confíe en que la función de desactivación esté codificada correctamente para restablecer limpiamente todas las variables de entorno a su estado anterior, teniendo en cuenta no solo la activación original , sino también cualquier interruptor , configuración o otro trabajo puedas haber hecho mientras tanto.

Probablemente esté bien, pero introduce un nuevo riesgo distinto de cero de dejar su entorno modificado después.

Sin embargo, técnicamente no es posible que un proceso altere directamente las variables de entorno de su padre, por lo que podemos usar un sub-shell separado para estar absolutamente seguros de que nuestros venvs no dejan ningún cambio residual:


Activar:

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

  • Esto inicia un nuevo shell alrededor del venv. Su bashcaparazón original permanece sin modificaciones.

Para desactivar:

$ exitO [CTRL]+[D]

  • Esto sale de todo el shell en el que se venvencuentra y lo regresa al shell original antes de que el script de activación realizara cambios en el entorno.

Ejemplo:

[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
fuente
-1

Tuve el mismo problema mientras trabajaba en un script de instalación. Eché un vistazo a lo que bin / active_this.py y lo revirtí.

Ejemplo:

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

No estoy 100% seguro de que funcione según lo previsto. Puede que me haya perdido algo por completo.

Lord Sumner
fuente
2
si la desactivación restablece el valor de la ruta del entorno, la ruta del sistema, la solicitud predeterminada, entonces su función de desactivación es un buen enfoque. Me gusta tu guion Ya se ha dado +1.
Ramkumar D