Python environments


To install different Python interpreters I strongly recommend asdf1.

Let's look at to install Python in two different OSes, macOS and Fedora.


To install asdf on a macOS, first install the general dependencies with

$ brew install coreutils curl git

then install asdf itself with

$ brew install asdf

Add to the shell, in our case zsh with:

$ echo -e "\n. $(brew --prefix asdf)/" >> ~/.zshrc

Add a plugin, in our case Python, with

$ asdf plugin add Python

You can list all available versions with

$ asdf list all Python

Install a specific version, say,

$ asdf install Python 3.9.0


To install asdf on a Fedora, first install the general dependencies

$ sudo dnf install curl git

Clone the repository

$ git clone \
  ~/.asdf --branch v0.8.0

Add to zsh with

$ . $HOME/.asdf/`


Compiling on macOS

pyenv can be notoriously problematic on macOS. For instance, running pyenv doctor on my laptop2 will result in:

Cloning ~/.pyenv/plugins/pyenv-doctor/bin/.....
Installing python-pyenv-doctor...
python-build: use readline from homebrew
python-build: use zlib from xcode sdk

BUILD FAILED (OS X 10.15.7 using python-build 20180424)

Inspect or clean up the working tree at /var/folders/c2/9d2fsqt57t10zn1f2ylp1jxw0000gn/T/python-build.20210128094523.17091
Results logged to /var/folders/c2/9d2fsqt57t10zn1f2ylp1jxw0000gn/T/python-build.20210128094523.17091.log

Last 10 log lines:
checking readline/readline.h, presence... no
checking for readline/readline.h,... no
checking readline/rlconf.h usability... yes
checking readline/rlconf.h presence... yes
checking for readline/rlconf.h... yes
checking for SSL_library_init in -lssl... no
configure: WARNING: OpenSSL <1.1 not installed. Checking v1.1 or beyond...
checking for OPENSSL_init_ssl in -lssl... no
configure: error: OpenSSL is not installed.
make: *** No targets specified and no makefile found.  Stop.
Problem(s) detected while checking system.

See for known solutions.

The problem in this case is that pyenv can't find the relevant C headers for compilation of new versions. This can be fixed by using:

$ CFLAGS="-I$(brew --prefix openssl)/include \
  -I$(brew --prefix readline)/include \
  -I$(xcrun --show-sdk-path)/usr/include" \
  LDFLAGS="-L$(brew --prefix openssl)/lib \
  -L$(brew --prefix readline)/lib \
  -L$(xcrun --show-sdk-path)/usr/lib" \
  pyenv doctor

and the output will be:

Cloning ~/.pyenv/plugins/pyenv-doctor/bin/.....
Installing python-pyenv-doctor...
python-build: use readline from homebrew
python-build: use zlib from xcode sdk
Installed python-pyenv-doctor to /var/folders/c2/9d2fsqt57t10zn1f2ylp1jxw0000gn/T/pyenv-doctor.20210128095003.18889/prefix

Congratulations! You are ready to build pythons!


Poetry as Jupyter kernel

To register a poetry environment (named foo) as a Jupyter kernel, run:

poetry run python -m ipykernel install --user --name foo


Create a new venv with the command:

$ virtualenv venv

and activate it using (under Bash or zsh) with:

$ source venv/bin/activate


First download Anaconda (or Miniconda). Once installed you can proceed to create environments3.

Creating environments

An environment foo can be created using

conda create --name foo

One it is created, it can be activated using

conda activate foo


  2. I'm running Big Sur at the moment of writing 

  3. The remainder will assume that you have installed Anaconda, rather than Miniconda