Wasn't that always a really bad idea to do, though, since it was so easy to break your system Python that way?
They can be installed at the system level, making the package available to any Python program on the system. This can get problematic if not all of your Python usage can function with the same versions of all system-installed packages.
They can be installed at the user level, sitting in your homedir instead of somewhere under /usr. This gives some isolation from the system defaults, but may just move the problem down a level - you still have the potential for version conflicts.
They can also be installed at the virtualenv level, and now the package install is specific to Python programs launched from that virtualenv. Upgrading a package can only break stuff in that virtualenv, it can't spread beyond it.
If you mostly use stuff from the standard library and stable packages that don't change their APIs much, you can go a long way without venvs before it actually bites you.
It's _great_ as a system, but for the love of $DIETY, why isn't there some sort of way to say: `sudo apt install $ALL_THE_COMPILERS@[latest||version]` ...semi-similarly to the "exceptions" made for frequently updated packages like `firefox`, `chromium`, etc...
I know of `asdf`, but it seems like a big miss that it's sometimes so hard to use debian "properly" (ie: via `apt ...`) to actually develop.
Or similarly, wouldn't it be great if similar to `LSP-language-server-protocol`, there was something like `PSP-package-server-protocol` where `npm`, `go.mod`, `pip`, etc... were all like: "yeah, the debian system packages for python, perl, etc. are great for debian-on-debian", but we should also support pulling an arbitrary project at an arbitrary version and make a best-effort attempt at being able to isolate, share, manage, upgrade packages between them.
From my experience, I'd recommend sticking with debian packages for everything if possible (they may be outdated, but might still work).
Altenatively, you can also cheat a bit, use docker to separate your dev environment from your system.
I always recommend rtx.
If system package managers could support the same use cases as packages managers for your favorite languages then the latter wouldn't need to exist.
Distribution maintainers have a very different idea of how dependencies should be managed than most developers using those package managers do.
sudo pip3 install bar_bar_bar
...depends foo_foo_foo@v4.5.6
...but debian-configure-thingy.py expects foo_foo_foo@v1.2.3
(or import path conflicts or whatever)
I know some Python maintainers think users are too dumb to work with system Python, but there are also some packages that are really hard to deal with on a system level if you try installing them in a venv. Plus venv's are dumb (I use Docker if I need more than one environment for specific apps or dev work), since it's another layer of abstraction I'd need to learn just to use Python.
I'm not forced to use virtual environments for PHP, Ruby, Java, etc... why for Python?
[1] https://www.jeffgeerling.com/blog/2023/how-solve-error-exter...
As a developer working mostly with Python I am so glad to have way to install a dependency in a directory that won't break my OS and without having to use docker. I still use docker for lots of things, but not as a way to resolve issues that can be resolved by creating a new directory.
No, this isn't python maintainers thinking users are too dumb.
This is distro maintainers fed up with false bug reports and broken systems caused by python's inability of versioning the packages fed to programs without venv.
python with pip has no ability to version modules correctly in the main package store and feed them to applications by version.
If one system installed package needs numpy 1.26.0 but another system installed package that'll brick your system needs 1.13.5. The result is, "WTF THESE BUG REPORTS IN OUR DEBIAN ISSUE TRACKER".
So virtualenv is now enforced, for everyone because that's python's only mechanism to feed versioned packages that avoid breaking packaged system software
But hey, at least they added the arg `--break-system-packages`
to pip.
LOL
You can also edit/create a pip.conf and add
[global]
break-system-packages = true
This actually improves the user experience for people who acknowledge what they are doing.
Makes some amount of sense to stop novices messing up their python install right off the bat, much like I have on most of my machines.