2022-03-29
Fixing Pipx when you upgrade your system Python version
If you use your system's Python for pipx and then upgrade your system and its version of Python, pipx can have a bad problem that renders your pipx managed virtual environments more or less unrecoverable if you do the wrong thing. Fortunately there turns out to be a way around it, which I tested as part of upgrading my office desktop to Fedora 35 today.
Pipx's problem is that it stashes a bunch of stuff in a ~/.local/pipx/shared virtual environment that depends on the Python version. If this virtual environment exists but doesn't work in the new version of Python that pipx is now running with, pipx fails badly. However, pipx will rebuild this virtual environment any time it needs it, and once rebuilt, the new virtual environment works.
So the workaround is to delete the virtual environment, run a pipx command to get pipx to rebuild it, and then tell pipx to reinstall all your pipx environments. You need to do this after you've upgraded your system (or your Python version). What you do is more or less:
# get rid of the shared venv rm -rf ~/.local/pipx/shared # get pipx to re-create it pipx list # have pipx fix all of your venvs pipx reinstall-all
Perhaps there is an easier way to fix up all of your pipx managed
virtual environments other than 'pipx reinstall-all
', but that's
what I went with after my Fedora 35 upgrade and it worked. In any
case, I feel that it's not a bad idea to recreate pipx managed virtual
environments from scratch every so often just to clean out any lingering
cruft.
(It also seems unlikely that there is any better way in general. In one way or another, all of the Python packages have to get reinstalled under the new version of Python. Sometimes you can do this by just renaming files, but any package with a compiled component may need (much) more work. Actually doing the pip installation all over again insures that all of this gets done right, with no hacks that might fail.)