My Python setup used to change a lot, as I would find ad-hoc solutions for my needs. These days I’ve settled on a Python setup that satisfies pretty much all of my different use cases and is easy to use. It is composed of these tools:
Pyenv for Python versions
pyenv install 3.8.0 pyenv shell 3.8.0
And you are ready to go.
Pyenv-virtualenv for virtual environments
Now that you are using Pyenv, you create virtual environments with different Python interpreters for your projects. Of course you could use Python’s venv module, and that is fine, but with Pyenv-virtualenv you get a clear interface and a Virtualenvwrapper like user experience:
pyenv virtualenv 3.8.0 my-project
Pipx for Python applications
It’s a bad practice to install Python packages in your system’s Python environment since it can mess it up: different packages installed can override one another and make system utilities dysfunctional. On the other hand, it’s pretty annoying to create a virtual environment for each new program you want to install and then add it to
PATH. Pipx solves that problem by creating the virtual environment for you and symlinking it to your local bin path. So to install black, you just write:
$ pipx install black ... $ which black /home/noam/.local/bin/black
Poetry is the new pipenv
Poetry and Pipenv are similar projects that have a joint appeal - improve Python’s packaging and dependency management. Pipenv was the pioneering project, it made a big splash when it came out about 2.5 years ago and I was eager to try it out. While using it, I found that many times it was slow and buggy (this was up to a year ago so things might have changed since). Poetry came out about a year later and offers pretty much the same features, but in contrast with Pipenv, it worked nicely for me from the get-go. There are many nice features to it, but I’ll just highlight a few that I like especially:
- Dependency resolver - Poetry comes with an elaborative and relatively quick dependency resolver . It shows which packages are at conflict and why, so it’s easy to understand and fix (if possible). This is a pretty big deal when adding requirements to an existing project. Doing so with pip and a simple
requirements.txtfile, can cause the application to break at run time, while using poetry shows you the conflict at the time you are adding it. Another nice related feature is the ability to print the dependency graph:
$ poetry show --tree pandas 0.25.3 Powerful data structures for data analysis, time series, and statistics ├── numpy >=1.13.3 ├── python-dateutil >=2.6.1 │ └── six >=1.5 └── pytz >=2017.2 ...
pyproject.toml - Poetry replaces the renowned
setup.pyfile with a
pyproject.tomlfile that is pretty simple to create and understand (you can see an example in a project of mine).
poetry.lock - The
poetry.lockfile is such a great addition since it “snapshots” the environment and allows poetry to reproduce the exact packages in each new installation without writing them explicitly in the
pyproject.tomlfile. This means that the project first-hand requirement remains very clear and separate from the verbose installation requirements (unlike using a regular
Tip! To use Poetry together with Pyenv, remember to activate the Python version specified in the
pyproject.toml file before running poetry. There are 2 ways to do so:
- Set the default Python interpreter for that project directory with
pyenv local 3.8.0.
pyenv shell 3.8.0before each time you want to use Poetry.
Good old Pycharm for full-blown development
Pycharm is not the fastest or best-looking editor around (I’m looking at you vscode), but it’s a great workhorse for full-blown Python development. For quick scripts, I might just use vim or vscode, but for bigger projects, Pycharm’s Python support is still the best around IMHO.