Cómo dejar / salir / desactivar un virtualenv de Python

Estoy usando virtualenv y el virtualenvwrapper. Puedo cambiar entre virtualenv simplemente usando el comando workon .

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

Sin embargo, ¿cómo salgo de todas las máquinas virtuales y trabajo de nuevo en mi máquina real? En este momento, la única manera que tengo de volver a

 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 lo crearía?

Por lo general, la activación de un virtualenv le da una función de shell llamada:

 $ deactivate 

que vuelve las cosas a la normalidad.

Editar 1

Acabo de ver específicamente el código de virtualenvwrapper, y, sí, también es compatible con deactivate como la forma de escapar de todos los virtualenvs.

Editar 2

Si está intentando abandonar un entorno de Anaconda , el procedimiento es un poco diferente: ejecute la source deactivate comandos de dos palabras source deactivate ya que implementan la desactivación utilizando un script independiente.

 bash-4.3$ deactivate pyenv-virtualenv: deactivate must be sourced. Run 'source deactivate' instead of 'deactivate' bash-4.3$ source deactivate pyenv-virtualenv: no virtualenv has been activated. 

Definí un workoff de alias como el opuesto de workon:

 alias workoff='deactivate' 

Fácil de recordar:

 [bobstein@host ~]$ workon django_project (django_project)[bobstein@host ~]$ workoff [bobstein@host ~]$ 
 $ deactivate 

Si esto no funciona, intente

 $ source deactivate 

Cualquiera que sepa cómo funciona el source bash pensará que es extraño, pero algunos envoltorios / flujos de trabajo alrededor de virtualenv se implementan como un complemento / contraparte a la source activate . YMMV

para activar el entorno virtual de Python:

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

para desactivar:

 $deactivate 

Puede usar virtualenvwrapper para facilitar la forma en que trabaja con virtualenv

Instalando virtualenvwrapper

 pip install virtualenvwrapper 

Si está utilizando shell estándar, abra su ~/.bashrc o ~/.zshrc si usa oh-my-zsh. Añade 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 tu virtualenv:

 (myenv)$ deactivate 

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

Utilice deactivate .

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

Nota, (my_env) se ha ido.

Yo uso zsh-autoenv que se basa en autoenv .

zsh-autoenv genera automáticamente los archivos .autoenv.zsh (conocidos / incluidos en la lista blanca), que generalmente se utilizan en los directorios raíz del proyecto. Maneja los eventos “entrar” y dejar “, anidamiento y ocultación 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 directorio dtree , el entorno virtual se dtree automáticamente.

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

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 # deactive/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 como estaba previsto, es posible que haya perdido algo por completo.