Setting Up a Modern Python Development Environment on Ubuntu 20.04
Table of Contents
Setting up a Python development environment can be daunting. For some, this setup will be overkill, but for a professional project, I’ve found these tools work well. The only prerequisite is an installation of Ubuntu 20.04. These instructions could be used on a different operating system or version of Ubuntu, but the specifics might change.
We’ll install the following tools.
- Pyenv helps us manage the version of our Python interpreters and allows us to change our default Python interpreter to one that is not the system interpreter.
- Pipx allows us to install CLI tools in isolated environments. Instead of installing the tools to the system interpreter or having to switch between various virtual environments, pipx installs the CLI tools in an isolated environment and exposes them for usage.
- Poetry manages our Python dependencies. Poetry ensures that the same versions of our Python packages are installed across environments such as develop, staging, and production. Poetry can also be used to publish Python packages.
Let’s start with an example scenario to demonstrate the use for the tools. Suppose that I’m working on a Django web application. The Django project uses Python 3.7 and Django 2.2, however, our project lead wants to upgrade to Python 3.8 and Django 3.1. Additionally, AWS hosts our Django project.
Pyenv helps us by installing Python 3.7 on our Ubuntu 20.04 system. The default system version is 3.8.2 which doesn’t work for our current project. Pyenv allows us to install the latest 3.7 for our Django project’s development environment. Also, once our project upgrades to Django 3.1 and Python 3.8, we use pyenv to install Python 3.8.5 so that we don’t use the system interpreter.
As I mentioned, AWS hosts our Django project. Occasionally, we’ll need to interact with
AWS via CLI. To do this, we’ll use the awscli package from AWS. The awscli program is
a Python CLI utility, and if, after setting up pyenv we
pip install awscli, awscli installs
into our global pyenv interpreter. This situation is better than installing the awscli to the system
interpreter but not ideal. Ideally, we isolate awscli into its own virtual environment.
However, we would have to activate that virtual environment every time we want to run the
CLI. Instead of doing this, we install pipx and use pipx to install the awscli. This allows
us to run the
aws command from anywhere and isolates the awscli utility into its own
Generally, poetry replaces pip. Instead of
pip install <package>, you would
poetry add <package>.
Poetry gives us a few extra features that pip doesn’t, namely, a record of top level project
dependencies, a separate record of top level development dependencies, a lock file which
locks all dependency versions, and the ability to publish Python packages. In this case,
these features make managing our Django project’s dependencies easier. Poetry automatically
pegs our dependencies to the latest major version so that upgrading our dependencies is safer.
Install the prerequisite packages for Ubuntu here.
Install pyenv using the installer here.
Follow the instructions here to update your .bashrc with the pyenv initialization step and environment variable.
Restart your shell:
Validate the installation:
Install your preferred version of Python:
pyenv install 3.8.5
- Note: this could take some time.
Set the newly installed python as your global interpreter:
pyenv global 3.8.5
Validate your global interpreter is the newly installed Python:
Install pipx via pip here.
Once you’ve installed pipx, restart your shell:
Validate the pipx installation:
Let’s install the awscli as a test:
pipx install awscli.
Validate the awscli install:
Important note: I recommend not installing poetry with pipx. For in depth reasons, see here.
Install poetry using the recommended installer here.
Update your shell:
Validate the installation:
Once again, this tutorial uses Ubuntu 20.04 as the base, but it should be usable for any other operating system or version of Ubuntu as well. The specific commands might change, but the ideas are the same. Some of these tools are newer to the Python world, but they’re gaining adoption. I found that once I understood the purpose of these tools they helped simplify my Python development process.