How to exit or deactivate a Python virtual environment when using virtualenvwrapper
I’m using virtualenv and virtualenvwrapper. I can switch between virtual environments using the workon command:
me@mymachine:~$ workon env1
(env1)me@mymachine:~$ workon env2
(env2)me@mymachine:~$ workon env1
(env1)me@mymachine:~$
How do I exit all virtual environments and return to the system environment? Currently, the only way I can get back to me@mymachine:~$ is to exit the shell and start a new one, which is inconvenient. Is there a command to work on “nothing” (i.e., deactivate the current virtual environment)? If such a command doesn’t exist, how can I create one?
To deactivate a virtual environment created with virtualenvwrapper, simply use the standard deactivate command. This command will exit your current virtual environment and return you to the system Python environment, removing the virtual environment prefix from your shell prompt and restoring your original PATH and environment variables.
Contents
- Basic Deactivation Method
- Alternative Approaches
- Creating a Custom Command
- Working with Multiple Environments
- Troubleshooting Common Issues
Basic Deactivation Method
The most straightforward way to exit a virtual environment when using virtualenvwrapper is by using the built-in deactivate command:
(env1)me@mymachine:~$ deactivate me@mymachine:~$
When you run the deactivate command:
- Your shell prompt will change from
(env1)me@mymachine:~$back tome@mymachine:~$ - The virtual environment’s Python interpreter will no longer be your active Python
- The
PATHenvironment variable will be restored to its original system state - Any environment variables specific to the virtual environment will be unset
This deactivate command is automatically set up when you activate any virtual environment using virtualenvwrapper, whether through workon or mkvirtualenv.
Alternative Approaches
Using workon with No Arguments
While workon is primarily used to switch between environments, you can also use it to see what environments are available:
(env1)me@mymachine:~$ workon Available environments: env1 env2 default
However, this doesn’t deactivate the current environment - it just lists available ones.
Using deactivate Directly
The deactivate command works regardless of how you activated the environment:
- If you activated with
workon env1 - If you activated with
source /path/to/venv/bin/activate - If you activated with
mkvirtualenv myenv
The command is the same in all cases:
(env1)me@mymachine:~$ deactivate me@mymachine:~$
Creating a Custom Command
If you prefer a more explicit command like workon none or exitenv, you can create a custom shell function. Here’s how to set it up in your shell configuration file (.bashrc, .zshrc, etc.):
Option 1: Simple workon none Function
workon() {
# If no arguments are provided, show available environments
if [ $# -eq 0 ]; then
command workon
# If "none" is specified, deactivate current environment
elif [ "$1" = "none" ]; then
deactivate
else
command workon "$@"
fi
}
Option 2: Dedicated exitenv Command
exitenv() {
if [ -n "$VIRTUAL_ENV" ]; then
deactivate
else
echo "No active virtual environment"
fi
}
Option 3: workoff Command
workoff() {
deactivate
}
To use any of these custom functions, add them to your shell configuration file and either restart your shell or run source ~/.bashrc (or equivalent).
Working with Multiple Environments
When working with multiple virtual environments, you might encounter situations where you need to switch between them cleanly:
Switching Between Environments
# Start with no active environment
me@mymachine:~$ workon env1
(env1)me@mymachine:~$ python --version
Python 3.9.7
# Switch to another environment
(env1)me@mymachine:~$ workon env2
(env2)me@mymachine:~$ python --version
Python 3.8.10
# Return to system environment
(env2)me@mymachine:~$ deactivate
me@mymachine:~$ python --version
Python 3.10.6
Checking Current Environment
You can check if you’re in a virtual environment and which one:
# Check if VIRTUAL_ENV is set
echo $VIRTUAL_ENV
# Output: /home/me/.virtualenvs/env1
# Check current Python interpreter
which python
# Output: /home/me/.virtualenvs/env1/bin/python
Troubleshooting Common Issues
Deactivate Command Not Found
If you get an error like “command not found” for deactivate, it usually means:
- You’re not actually in a virtual environment
- Your shell startup scripts haven’t properly sourced virtualenvwrapper
Verify you’re in a virtual environment by checking your prompt or the VIRTUAL_ENV variable.
Shell Prompt Doesn’t Change After Deactivation
If your prompt still shows (env1) after running deactivate, try:
- Running
deactivateagain - Starting a new shell session
- Checking your
PS1environment variable
Environment Variables Persist
If some environment variables remain set after deactivation, you may need to:
- Check if they were set in your shell startup scripts
- Manually unset them:
unset MY_VAR
Virtualenvwrapper Not Properly Installed
If you’re having consistent issues with virtualenvwrapper commands:
- Verify installation:
which workon - Check if it’s sourced in your shell config file
- Ensure it’s loaded before you try to use any commands
Conclusion
To exit or deactivate a Python virtual environment when using virtualenvwrapper, simply use the standard deactivate command. This built-in command will cleanly exit your virtual environment and return you to the system Python environment. You don’t need to create custom commands unless you prefer a more explicit interface.
Key takeaways:
- Use
deactivateto exit any virtual environment - The command works regardless of how you activated the environment
- Your shell prompt will automatically update to show you’re no longer in a virtual environment
- You can create custom functions if you prefer different command names
By mastering the deactivate command, you can efficiently manage your virtual environments without having to exit and restart your shell session.