Note: Mise was previously called RTX
I have tried a lot different ways of managing multiple Python versions on different Linux systems.
- pyenv
- Uses shims which is confusing, especially for new users
- Compiling from source
- Takes time and can easily create broken installations with missing features
- Using docker containers
- Works but is not IDE friendly or ergonomic for developers
- Using nix
- Seems very promising but makes it very difficult to install additional packages with pip
After looking around I have finally found something that I think works very well!
Something called Mise-en-Place Mise
https://github.com/jdxcode/mise
Follow the installation instructions here https://github.com/jdxcode/mise#installation
For Ubuntu/Debian based systems you can install it using apt for instance.
Make sure that it is installed.
$ mise --version
2023.12.35 linux-x64 (da025fe 2023-06-03)
And make sure that it is hooked up to your shell.
# For bash users
$ echo 'eval "$(mise activate bash)"' >> ~/.bashrc
# For zsh users
$ echo 'eval "$(mise activate zsh)"' >> ~/.zshrc
# For fish users
$ echo 'mise activate fish | source' >> ~/.config/fish/config.fish
With Mise you can then manage your Python installations. It will download and compile the versions from source. This can be tricky since it requires that you have the correct build environment in place.
I like to use the one that pyenv suggests. https://github.com/pyenv/pyenv/wiki#suggested-build-environment
$ sudo apt update; sudo apt install build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev curl \
libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev
To change the global default Python installation (the one active on your user and shell).
$ mise use --global [email protected]
# Downloads, compiles and activates the Python installation
# Takes around 50 seconds on my machine
Downloading Python-3.11.4.tar.xz...
-> https://www.python.org/ftp/python/3.11.4/Python-3.11.4.tar.xz
Installing Python-3.11.4...
mise [email protected] running python-build
$ python --version
3.11.4
In some cases it is nice to have a up to date global Python version active like above. But, when working in a
specific project with older code for instance you might need an older Python version. In that case you can
create a .mise.toml
file in the project folder to have it automatically activate a perticular version.
$ python --version
Python 3.11.4
$ cat my_project/.mise.toml
[tools]
python = {version='3.10.12', virtualenv='.venv'}
$ cd my_project
[WARN] Tool not installed: [email protected]
$ mise local --install-missing
$ python --version
Python 3.10.12
$ which python
/home/antonfr/my_project/.venv/bin/python
$ cd ..
$ python --version
Python 3.11.4
Note that with the .mise.toml
file above we also specified a virtualenv to create.
So not only does Mise switch the python version automatically when navigating into the folder,
it also activates the virtualenv for you. Very neat stuff!
Mise can even help you install and manage the [poetry] version you have installed. Although, poetry management is not directly available from Mise out of the box so you have to install a plugin first.
$ mise plugin install poetry
$ mise use --global [email protected]
$ poetry --version
Poetry (version 1.6.1)
It also works with project specific versions.
$ poetry --version
Poetry (version 1.6.1)
$ cat my_project/.mise.toml
[tools]
poetry = {version='1.5.1', pyproject='pyproject.toml'}
python = {version='3.10.12', virtualenv='.venv'}
$ cd my_project
[WARN] Tool not installed: [email protected]
$ mise install
$ poetry --version
Poetry (version 1.5.1)
NOTE: poetry should be placed above python in the .mise.toml file
If something goes wrong or you simply want to uninstall Mise and all of the installed environments you can follow the official documentation. https://github.com/jdxcode/mise#uninstalling