I was slow to get to grips with venv. It sounds like you are on the same path. This note tries to be constructive advice -
* Some distro software uses python. Let the package manager take care of dependencies for that.
* For everything else, use an dedicated virtualenv for each codebase you are working with.
> I used to just use pip to install to the system
Never do this, for the reasons you cite.
> I've dabbled with virtualenv, but it's such a pain to set up and activate
Setup for virtualenv: "python3 -B -m venv venv". Have a shell alias 'alias v=". venv/bin/activate"' that allows you to activate it if you need to install libraries or access a shell. "pip install blah" for library install. That should be all you need.
> If I have a few projects with similar libraries
> it's more of a pain to set them all up and switch around
Have a think about why you feel this way, and whether you could mitigate the problems.
Here is what I do. Once my libraries are installed for the current project, I rarely activate venv in the current shell. Rather, for each python project, I have a bash script "app" in the root of the project, and a dedicated "venv" directory.
The app script does the following: (1) sources the local venv; (2) does pip freeze > requirements.txt to capture any dependency changes; (3) launches the project. Often I will have multiple launchers in that script, with all of them commented out except for the active one. Be in a habit of always launching from that app script.
To reiterate the approach above, whenever you sit down to write some python code, ensure that you have a dedicated venv for it, and that you are only ever launching code from that local venv.
I have spoken to developers who get upset at the extra hard disk overhead. You don't need to optimise for hard disk usage. Hard disk space is almost free.
I don't bother creating setup.py files, except for the odd occasion that I want to publish code to pip. Good luck.