Python versions
Butler manages Python versions through uv,
the same way it manages Node through fnm. Versions are prebuilt downloads — no
compiler, no waiting on a source build.
Install Python
Section titled “Install Python”Python support comes from the uv component. Install it once, then install the
versions you want:
butler install uvbutler uv python install 3.13butler uv python install 3.11List what you have, and see which one applies where you are:
butler uv python listbutler uv python findThe Python tab in the menu bar app does the
same things with a picker, and only appears once uv is installed.
Run python, pip and venv
Section titled “Run python, pip and venv”After shell integration, python,
python3, pip, pip3 and venv are on your PATH and resolve the version
for the directory you’re in:
python --versionpip install httpxvenv .venvResolution follows uv’s own rules — an activated virtualenv first, then a
.venv in the project, then .python-version, then your default. Nothing is
installed as a side effect of asking: if a project pins a version you don’t
have, you’ll be told rather than made to wait for a download.
You can always reach uv directly for anything not covered by a shim:
butler uv run script.pybutler uv syncbutler uv pip listThese work outside your terminal, too
Section titled “These work outside your terminal, too”This is the part that usually bites. A version manager’s shell integration only runs in an interactive shell, so an editor, a build script, a Makefile, a git hook or a scheduled job quietly gets whatever system Python it finds — which is how you end up debugging a “works in my terminal” failure for an hour.
Butler installs real files on PATH rather than shell functions, so anything
that inherits your environment resolves the same interpreter your terminal
does. Nothing needs to source a profile first.
Put Butler’s toolchain on your PATH
Section titled “Put Butler’s toolchain on your PATH”If you’d rather call python, pip, node and php directly, without the
butler prefix:
butler shell installOpen a new terminal, then check what’s actually resolving:
butler doctorbutler doctor reports each shim and the interpreter it resolves to, and says
plainly when something earlier on your PATH is shadowing Butler’s — which is
the usual cause of “I installed 3.13 but I’m still on 3.9”.
Where the versions live
Section titled “Where the versions live”Butler points uv at its own directory, so the interpreters it downloads sit
under Butler’s state (~/Library/Application Support/Butler/Data/uv) and
butler reset reaches them.
If you already had uv with Pythons installed, those stay exactly where they are and keep working — Butler does not move or adopt them.