So You Want to Solve Python Packaging: A Practical Guide

First, the technical: Python is used by vastly different groups of people, some that don't identify as "developers". Those groups often have disparate expectations about how packaging should work. Some don't even know what a package is.

Some don't even know they're using Python! Here's some examples: Python's in the Linux Standard Base and bunch of critical Linux stuff is written in Python. Distros gotta package those & their deps into their package database (deb/rpm).

Most distros want nothing to do with the language-specific package manager. They want to manage everything though rpm/deb/portage/whatever and they don't want you fucking around with system packages. Ever got burned by Python included with macOS? Yeah, same deal

So OS vendors want Python to be invisible to the user. They want it for system purposes, and they want to distribute python apps, scripts, and packages on their own terms. Cool. Let's pick another group: academics and researchers.

They want to do their research. They don't want to program Python. They want to work their data, create visualizations, and very importantly: they want fellow researchers to be able to use their code. These folks don't really want to think about packaging.

The packages they use, however, are complex fucking monsters. They're a mix of C, C++, FORTAN, Haskell, Julia, and god knows what else. They don't want to waste time installing build tools and compiling these things. Their packages need to be precompiled and ready to go.
Precompilation is *hard*, especially for high-performance libraries. You can't just distribute a build will all the fancy vector extensions enabled cause someone on a different processor won't be able to use it. You wanna see a nightmare? Look at TensorFlow.
Fundamentally these users do not want to think about this shit, and they're a *huge* group of users. You know who does think about this shit? Web developers, and every time someone comes along with "Python packaging sucks and someone should fix it" they're a web dev.

That's because web devs have different expectations. They *expect* to work with a packaging tool. They expect to find and install dependencies. They don't expect to work with a ton of native dependencies. They don't have the same problems.

This only scratches the surface of the technical complexity here. The reason there are so many tools for managing Python dependencies is because Python is not a monoculture and different folks need different things.

But let's assume for a moment that you can overcome those technical challenges. You can create a tool and workflow that works for the vast majority. Now you have to deal with people. You gotta convince a bunch of unpaid volunteers that you're right and that they should help.
You gotta convince a bunch of unpaid volunteers maintaining existing tools to give up their projects for your solution. Projects they built from the ground up for their own use case. You gotta write several PEPs and get them accepted.
You gotta deal with the politics: The PyPA which is completely volunteer and has all the responsibility of maintaining existing tools and practically no real authority or resources. They aren't a unified body, more of a loose collection of people that chat sometimes.
You gotta deal with the Python Core team and the steering council. They have consistently abdicated the details of packaging to the community. They aren't, at this time, very interesting in taking over packaging and telling the community how to manage their dependencies.
You gotta deal with downstream distributors and major users. Linux distros, Apple, Google, AWS, Anaconda, and so many more. Google's using Bazel to build their Python projects, good luck with that one!
You gotta deal with the users and the stans. Wanna know why I stopped working on Python packaging? I got harassed for *months* because KR picked a fight with Reddit right when I dared to include pipenv on http://packaging.python.org. Fuck that.
Python Packaging User Guide — Python Packaging User Guide

The Python Packaging User Guide (PyPUG) is a collection of tutorials and guides for packaging Python software.

So you want to fix Python packaging: you fucking can't. get lost.
@stargirl #Nix offers a genuine solution and a path towards packages as capabilities. #nixpkgs has a mature #Python subsystem. No involvement with PSF is required.
@corbin @stargirl this might be true for NixOS, but using Nix on other systems (like Fedora, as I have), my experience is that it gets weird-and-broken pretty quick in ways that are confusing, and the community can be quick to point out your error is simply because you are not using NixOS.

@whack @corbin @stargirl

> my experience is that it gets weird-and-broken pretty quick in ways that are confusing,

This usually happens somewhere in the vicinity of loading drivers (e.g. libcuda or libGL), which currently is only accommodated by wrappers (nixglhost, nixGL) and, yes, sucks. It's hard to improve upon because of how other dsitributions mix userspace drivers and normal libraries, but there are some cursed ideas being talked about involving libcapsule...

@whack @corbin @stargirl

> community can be quick to point out your error is simply because you are not using NixOS.

They're wrong to set such a low bar, we'll silence them!

@nobody @whack @stargirl It's a fair critique, though, and one that spawns from the *same* memetic issue as in Python packaging, so it's worth examining.

Sure, a Nix package *should* only rely on being located in /nix/store next to its dependencies. But as you've listed, there's piles of ambient authorities and mutable state which also must be correctly configured in order for some packages to run.

This is *exactly* analogous to Python packages which aren't pure statically-imported Python modules. In a simpler world, we would deploy Python apps by tossing all Python modules into a single ZIP file, but because CPython allows extension modules and exposes a C API, a practical Python app must also depend on C runtime and C linkage.

This isn't hypothetical. RPython, the toolkit for building PyPy, is pure Python 2.7. My rpypkgs flake https://github.com/rpypkgs/rpypkgs "installs" RPython packages by unpacking all of them to a common build directory.

GitHub - rpypkgs/rpypkgs: Packages built with RPython

Packages built with RPython. Contribute to rpypkgs/rpypkgs development by creating an account on GitHub.

GitHub