Pyenv is an excellent tool to have in your tool-set, it manages Python versions much like rbenv
for Ruby, in fact it was forked from it.
pyenv lets you easily switch between multiple versions of Python. It’s simple, unobtrusive, and follows the UNIX tradition of single-purpose tools that do one thing well.
Installation
The automatic installer provided in GitHub will take care of everything so you don’t have to worry about configuring anything. (pro-tip: triple click to select the whole line).
curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash
That’s the only thing you have to do, if you’re having issues installing a python version then you will have to install the development libraries:
sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev \
libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \
xz-utils tk-dev
Usage
Install another version:
pyenv install 2.7.14
# Output
Downloading Python-3.6.4.tar.xz...
-> https://www.python.org/ftp/python/3.6.4/Python-3.6.4.tar.xz
Installing Python-3.6.4...
Installed Python-3.6.4 to /home/franccesco/.pyenv/versions/3.6.4
Check installed versions
pyenv versions
# Output
system
* 2.7.14 (set by /home/franccesco/.pyenv/version)
3.6.4
Check current version
pyenv version
# Output
2.7.14 (set by /home/franccesco/.pyenv/version)
Set global version
pyenv global 3.6.4
# No output; check with version command.
Set python version per directory
pyenv local 2.7.14
# No output; check with version command.
A file named .python-version
should contain the python version to use uppon entering the folder: cat .python-version
# Output
2.7.14
Uninstall a version
pyenv uninstall 2.7.14
# Output
pyenv: remove /home/franccesco/.pyenv/versions/2.7.14? yes
Update Pyenv
pyenv update
# Output
Updating /home/franccesco/.pyenv...
From https://github.com/pyenv/pyenv
* branch master -> FETCH_HEAD
Already up-to-date.
-- SNIP --
Updating /home/franccesco/.pyenv/plugins/pyenv-virtualenv...
From https://github.com/yyuu/pyenv-virtualenv
* branch master -> FETCH_HEAD
Already up-to-date.
Updating /home/franccesco/.pyenv/plugins/pyenv-which-ext...
From https://github.com/yyuu/pyenv-which-ext
* branch master -> FETCH_HEAD
Already up-to-date.
Final Words
Pyenv has a great integration with Pipenv and you can manage Python versions and package versions with both of them at the same time without any hassle, I greatly recommend you to check them out.