I'm using virtualenv and the virtualenvwrapper. I can switch between virtualenv's just fine using the workon command.
me@mymachine:~$ workon env1
(env1)me@mymachine:~$ workon env2
(env2)me@mymachine:~$ workon env1
(env1)me@mymachine:~$
However, how do I exit all virtual machines and workon my real machine again? Right now, the only way I have of getting back to
me@mymachine:~$
is to exit the shell and start a new one. That's kind of annoying. Is there a command to workon "nothing", and if so, what is it? If such a command does not exist, how would I go about creating it?
转载于:https://stackoverflow.com/questions/990754/how-to-leave-exit-deactivate-a-python-virtualenv
Usually, activating a virtualenv gives you a shell function named:
$ deactivate
which puts things back to normal.
I have just looked specifically again at the code for virtualenvwrapper,
and, yes, it too supports deactivate
as the way to escape from all virtualenvs.
If you are trying to leave an Anaconda environment, the procedure is a bit different: run the two-word command source deactivate
since they implement deactivation using a stand-alone script.
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.
Had the same problem myself while working on an installer script, I took a look at what the bin/activate_this.py did and reversed it.
Example:
#! /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())
Not 100% sure if it works as intended, I may have missed something completely.
I defined an alias workoff as the opposite of workon:
alias workoff='deactivate'
Easy to remember:
[bobstein@host ~]$ workon django_project
(django_project)[bobstein@host ~]$ workoff
[bobstein@host ~]$
$ deactivate
If this doesn't work , try
$ source deactivate
Anyone who knows how bash source
works will think that's odd, but some wrappers/workflows around virtualenv implement as a compliment/counterpart to source activate
. YMMV
to activate python virtual environment:
$cd ~/python-venv/
$./bin/activate
to deactivate:
$deactivate
You can use virtualenvwrapper
in order to ease the way you work with virtualenv
Installing virtualenvwrapper
pip install virtualenvwrapper
If you are using standard shell, open your ~/.bashrc
or ~/.zshrc
if you use oh-my-zsh. Add this two lines:
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh
To activate an existing virtualenv, use command workon:
$ workon myenv
(myenv)$
In order to deactivate your virtualenv:
(myenv)$ deactivate
Here is my tutorial, step by step in how to install virtualenv and virtualenvwrapper
I use zsh-autoenv which is based off autoenv.
zsh-autoenv automatically sources (known/whitelisted)
.autoenv.zsh
files, typically used in project root directories. It handles "enter" and leave" events, nesting, and stashing of variables (overwriting and restoring).
Here is an example:
; 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
So when I leave the dtree
directory, the virtual environment is automatically exited.
(my_env) basant@basant:~/EonTraining/my_env$ deactivate
use 'deactivate'
basant@basant-Lenovo-E40-80:~/EonTraining/my_env$
Gone (my_env);