jdx/mise · error · eyre::Report
pipx is required to install {} but was not found. {instruct
Error message
pipx is required to install {} but was not found.
{instructions} What it means
The pipx backend refuses to install a `pipx:` tool when it cannot find a usable pipx. mise first tries the uv/uvx branch; when uv is unavailable or disallowed (`uvx = false` on the package or the `pipx.uvx` setting), it falls back to pipx and bails if pipx is neither configured as a mise tool in the dependency toolset nor spawnable on PATH. The message embeds the install instructions (mise use pipx@latest, or mise use uv@latest when uvx is allowed).
Source
Thrown at src/backend/pipx.rs:337
// bare "No such file or directory (os error 2)". Skipped when a configured tool
// provides pipx, since mise installs that first — same rule as the warning.
//
// The gate asks `spawnable_dependency`, the same question `spawn_program` asks
// below, so it cannot pass on evidence the spawn will then reject. On Windows a
// `pipx.ps1` or a shebang-only `pipx.pyz` satisfies the plain lookup but cannot
// be launched, and it used to reach `pipx install` and die with
// "program not found" instead of these instructions.
let pipx_configured = match self.dependency_toolset(&ctx.config).await {
Ok(ts) => ts.versions.keys().any(|ba| ba.short == "pipx"),
Err(_) => false,
};
if !pipx_configured
&& self
.spawnable_dependency(&ctx.config, Some(&ctx.ts), "pipx")
.await
.is_none()
{
bail!(
"pipx is required to install {} but was not found.\n\n{instructions}",
self.ba()
);
}
}
let request = self.tool_name().parse::<PipxRequest>()?;
if let Some(uv_program) = uv_program {
let package_request = request.uvx_request(&tv.version, &options);
self.warn_if_uv_may_not_support_exclude_newer(ctx).await;
ctx.pr
.set_message(format!("uv tool install {package_request}"));
let mut cmd = Self::uvx_cmd(
&uv_program,
&ctx.config,
&["tool", "install", &package_request],
self,View on GitHub (pinned to 6f52dcdf99)
Solutions
- Add pipx as a mise-managed dependency so mise installs it first: `mise use pipx@latest` alongside the pipx: tools
- Install uv instead when uvx is allowed: `mise use uv@latest` — the pipx check is skipped entirely on the uv branch
- Install pipx system-wide (e.g. `pip install --user pipx` / `brew install pipx`) so spawnable_dependency finds it
- Remove `uvx = false` / `pipx.uvx = false` if you actually have uv installed
Example fix
# before [tools] "pipx:httpie" = "latest" # after [tools] pipx = "latest" "pipx:httpie" = "latest"
Defensive patterns
Strategy: validation
Validate before calling
command -v pipx >/dev/null 2>&1 || mise ls pipx >/dev/null 2>&1 || command -v uv >/dev/null 2>&1 || echo 'need: mise use pipx@latest (or uv@latest)'
Prevention
- Declare pipx (or uv) as a mise tool in the same mise.toml that uses pipx: packages
- In Dockerfiles, add `RUN mise use pipx@latest` before installing pipx: tools
- Don't set pipx.uvx=false globally unless pipx is guaranteed present
When it happens
Trigger: `mise use pipx:httpie` on a machine where pipx is not on PATH and not declared in mise.toml, while uv is also missing or uvx is disabled. On Windows a pipx.ps1 or shebang-only pipx.pyz counts as absent because it is not spawnable.
Common situations: Fresh CI containers, minimal Docker images, new laptops without Python tooling, or teams that set `pipx.uvx = false` globally while only installing uv.
Understand the failure class
Background: "not installed", "pip install", "required for": how missing-dependency errors surface across open-source libraries — this error's family across 34 libraries.
Related errors
- URL must use s3:// scheme, got: {}
- S3 URL must include bucket name
- artifactbundle must be true, false, 1, or 0, got {value}
- install_command must be a non-empty string
- install_command cannot be used with filter_bins
AI-assisted analysis of jdx/mise@6f52dcdf99 (2026-08-22).
Data as JSON: /api/errors/14bd95f9a5cb7225.
Report an issue: GitHub.