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

  1. Add pipx as a mise-managed dependency so mise installs it first: `mise use pipx@latest` alongside the pipx: tools
  2. Install uv instead when uvx is allowed: `mise use uv@latest` — the pipx check is skipped entirely on the uv branch
  3. Install pipx system-wide (e.g. `pip install --user pipx` / `brew install pipx`) so spawnable_dependency finds it
  4. 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

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


AI-assisted analysis of jdx/mise@6f52dcdf99 (2026-08-22). Data as JSON: /api/errors/14bd95f9a5cb7225. Report an issue: GitHub.