Python on Managed Linux Workstations

With the switch from Ubuntu to Debian on our managed Linux workstations, we also re-evaluated how to install and manage Python packages. We opt for a central installation with a given set of packages, instead of varying setups from one host to the other.

System Python

Debian Bookworm ships with Python 3.11 and the PEP 668 flag that it's "externally managed". This protects the system-wide packages by preventing the use of pip to install packages globally or within the user scope. Instead users should create proper virtual environments. We only install the minimum of Python packages required for system administration. If you need Python 3.11, feel free to create virtual environments with your packages. But in general we recommend to use our Pyenv Python.

Pyenv Python

We manage a central Python 3.12 installation with pyenv and hundreds of pre-installed packages in our /opt/software/ NFS mount available on all managed Linux workstations.

In order to use it, source the corresponding environment variables.

source /opt/software/pyenv/env/default

Afterwards start using Python and its packages.

python -m pip list  # list all installed packages

Note that your Python scripts should have the generic #!/usr/bin/env python3 shebang to allow easy switching of the Python interpreter.

If you need additional packages, or different versions than what we provide, create a virtual environment that inherits our installed packages, so that you only need to install the differences.

cd path/to/your/project
python3 -m venv --system-site-packages .venv
source .venv/bin/activate
pip install somepackage==1.0
pip list --local

There is currently only one installation inside /opt/software/pyenv/, but we will probably add different versions in the future. Although this is similar in spirit to what is done on Euler HPC, we may not completely freeze all package versions but potentially update some packages in-place. So consider working with dedicated venvs if your projects are very sensitive to package versions.

Configuring pyenv as additional kernel in JupyterHub

If you are using a locally installed JupyterHub, you can add the pyenv Python as separate iPython kernel.

source /opt/software/pyenv/env/default
ipython kernel install --name "opt-software-pyenv" --user

This creates a custom configuration ~/.local/share/jupyter/kernels/opt-software-pyenv/kernel.json in your home. Inside JupyterHub you should now be able to pick this kernel in the Kernel -> Change kernel menu.