📖 An ode to Poetry
Recently Over a year ago, when I first started this post, I’d been moving over Python projects from pipenv to Poetry. Not to be hipster – well maybe a bit – but mainly out of growing discontent. Hacker News had a typically heated discussion around this, which led me to give up on everything, but at least note to try Poetry soon.
Now it’s gone 1.0
and the dust has settled, it seemed only right to finish the post…
Pipenv: the good bits
Shall I compare thee to a summer’s day?
A lightweight dependencies file
A single file to declare. I mean, a lot like requirements.txt
but, better?
Runtime and dev dependencies
This is something many other build systems have had, and NPM made particularly popular. As the number of excellent Python-made dev tools (pytest, black, precommit etc) goes up then this seems quite useful.
A lockfile too (eventually)
Yay, now we can freeze things. Like all the other package managers.
Pipenv: the bad bits
Why didst thou promise such a beauteous day?
Admittedly, I think a lot of the problem was really the implied promise that Python packaging would finally be fun, and isolated, and repeatable, and fast. Arguably:
- As boringly reliably as Maven
- As flexible as Gradle
- As popular as NPM
- As fast as Yarn (or Gradle on a good day)
- As smart as Stack or Cargo
- As isolated as NPM / Stack
Though thou repent, yet I have still the loss
The final straws were the endless version upgrades and broken releases. Maybe it’s fixed now, but it lost trust for a lot of people, and the speed issues were noticeable on some projects too.
A bit of Poetry
What is your substance, whereof are you made?
Well, Poetry is a new newish newer not so new build system for Python, with a modern CLI and a decent dependency graph resolution algorithm. Version one is out any minute now at last (see the extended 1.0 release notes) 🎉.
Thou art more lovely and more temperate
- 🚀 Faster - I can’t prove this, but it always seems faster.
- 💅 Prettier. Yes this is subjective, but it matters - whether just colour output or well-designed CLI. Even the site is pretty…
- 🧙 Does dependency resolution properly.
- 🎁 Does packaging too! Yes, you can now get rid of horrible
setup.py
files forever (edit: not forever, but sometimes at least) - 🔍 You can show resolution results for debugging:
poetry show -t
is especially nice. - 🆕 You can export to
requirements.txt
natively now:poetry export -f requirements.txt -o requirements.txt
So long lives this, and this gives life to thee
Some gotchas
- Full
virtualenv
management isn’t quite there… (it creates a virtualenv at initialisation if there isn’t one). - Update:
1.0
now haspoetry env
which does quite a lot.
Bugs aplenty with 1.0
There are quite a lot of open bugs at the moment. Not a good metric necessarily, but we’ve found problems…
Nightmares with virtualenv and private repos. To be fair, I think it’s Python’s
venv
itself (combined with Ubuntu 19’s Python distro), but we’ve found thatpip
of a very old version is installed, and this doesn’t play nicely with private repos and Poetry 1.0’s usage of--index-url
and--extra-index-url
(I think). Either way, the workaround is:poetry run pip install --upgrade pip
for every affected project…
Last thoughts
Support
Since switching PyCharm got native Pipenv support, but hey.
In fairness Pycharm Poetry support is in discussion, at least. In fact, go vote on it! A lot of people would love to see this in PyCharm. Note it’s not really implementable as a standard plugin either (read the question I posted there).
Tips
Over the last year I’ve come to love this config (updated for 1.x): poetry config virtualenvs.in-project true
as many more tools / IDEs play nicer if you keep a local .venv
.