Best practice for Python development is to create virtual environments, ideally one per project, but this often leads to scattered environments across your system. With pyenv
and its plugin pyenv-virtualenv
, you can centralize all environments in one location. Pyenv
is a powerful tool for managing multiple Python versions, while pyenv-virtualenv
extends it by enabling seamless virtual environment creation and management. This combination keeps your Python environments well-organized, ensures they are tied to specific Python versions, and even allows automatic activation based on the project directory, making development simpler and more efficient. Here's how to set it up:
Install and Configure pyenv
and pyenv-virtualenv
1. Install System Package for Virtual Environments
First, install the required venv
package for your system's default Python version:
# Get the default Python version from the system PYTHON_VERSION=$(python3 --version | awk '{print $2}' | cut -d. -f1,2) # Install the appropriate package sudo apt install -y python${PYTHON_VERSION}-venv
2. Clone pyenv
and pyenv-virtualenv
Clone both pyenv
and the pyenv-virtualenv
plugin:
# Clone pyenv git clone https://github.com/pyenv/pyenv.git ~/.pyenv # Clone pyenv-virtualenv plugin git clone https://github.com/pyenv/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv
3. Update Shell Configuration
Modify your shell configuration files (~/.bashrc
, ~/.profile
, or ~/.bash_profile
) to include the necessary environment variables and initialization commands. Use the following commands based on your shell configuration:
Add to ~/.bashrc
:
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc echo 'eval "$(pyenv init -)"' >> ~/.bashrc
Add to ~/.profile
(if ~/.bashrc
is not sourced):
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.profile echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.profile echo 'eval "$(pyenv init -)"' >> ~/.profile
Add to ~/.bash_profile
(alternative to ~/.bashrc
):
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
4. Reload Shell
To apply the changes, reload your shell:
source ~/.bashrc # Or source the relevant file, e.g., ~/.profile or ~/.bash_profile
Using the pyenv to manage the environment
Create a Virtual Environment
Use pyenv virtualenv
to create a new virtual environment tied to a specific Python version:
pyenv install 3.11.6 # Install the desired Python version pyenv virtualenv 3.11.6 myenv # Create a virtual environment named 'myenv'
List Virtual Environments
View all available virtual environments:
pyenv virtualenvs
Activate a Virtual Environment
Manually activate a virtual environment:
pyenv activate myenv
Deactivate a Virtual Environment
Deactivate the currently active virtual environment:
pyenv deactivate
Delete a Virtual Environment
Remove a virtual environment:
pyenv uninstall myenv
Set a Local Environment (Auto-Activate)
To associate a virtual environment with a specific project directory, navigate to the project and set the local environment:
cd /path/to/project pyenv local myenv
This creates a .python-version
file in the project directory. The virtual environment will auto-activate whenever you enter the directory.
Verification
- Verify the installed
pyenv
version:bash pyenv --version
- Verify
pyenv-virtualenv
integration:bash pyenv virtualenvs