Files
uv/docs/guides/tools.md
T

294 lines
7.2 KiB
Markdown
Raw Normal View History

---
title: Using tools
description:
A guide to using uv to run tools published as Python packages, including one-off invocations with
uvx, requesting specific tool versions, installing tools, upgrading tools, and more.
---
2024-07-15 18:04:18 -04:00
# Using tools
Many Python packages provide applications that can be used as tools. uv has specialized support for
easily invoking and installing tools.
2024-07-15 18:04:18 -04:00
## Running tools
2024-07-15 18:04:18 -04:00
2024-07-22 13:15:11 -04:00
The `uvx` command invokes a tool without installing it.
2024-07-15 18:04:18 -04:00
For example, to run `ruff`:
```console
$ uvx ruff
```
2024-07-22 13:15:11 -04:00
!!! note
2024-07-15 18:04:18 -04:00
2024-07-22 13:15:11 -04:00
This is exactly equivalent to:
```console
$ uv tool run ruff
```
2024-08-05 09:54:06 -04:00
`uvx` is provided as an alias for convenience.
2024-07-15 18:04:18 -04:00
2024-07-22 13:15:11 -04:00
Arguments can be provided after the tool name:
2024-07-15 18:04:18 -04:00
```console
$ uvx pycowsay hello from uv
-------------
< hello from uv >
-------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
```
2024-08-12 13:17:38 +02:00
Tools are installed into temporary, isolated environments when using `uvx`.
2024-08-22 17:58:05 -05:00
!!! note
If you are running a tool in a [_project_](../concepts/projects/index.md) and the tool requires that
2024-08-24 01:17:37 +03:00
your project is installed, e.g., when using `pytest` or `mypy`, you'll want to use
[`uv run`](./projects.md#running-commands) instead of `uvx`. Otherwise, the tool will be run in
a virtual environment that is isolated from your project.
If your project has a flat structure, e.g., instead of using a `src` directory for modules,
the project itself does not need to be installed and `uvx` is fine. In this case, using
`uv run` is only beneficial if you want to pin the version of the tool in the project's
dependencies.
2024-08-22 17:58:05 -05:00
2024-07-15 18:04:18 -04:00
## Commands with different package names
When `uvx ruff` is invoked, uv installs the `ruff` package which provides the `ruff` command.
However, sometimes the package and command names differ.
2024-07-15 18:04:18 -04:00
The `--from` option can be used to invoke a command from a specific package, e.g., `http` which is
provided by `httpie`:
2024-07-15 18:04:18 -04:00
```console
$ uvx --from httpie http
```
## Requesting specific versions
To run a tool at a specific version, use `command@<version>`:
```console
$ uvx ruff@0.3.0 check
```
To run a tool at the latest version, use `command@latest`:
```console
$ uvx ruff@latest check
```
2024-07-19 10:26:54 -04:00
The `--from` option can also be used to specify package versions, as above:
2024-07-15 18:04:18 -04:00
2024-07-19 10:26:54 -04:00
```console
$ uvx --from 'ruff==0.3.0' ruff check
```
Or, to constrain to a range of versions:
2024-07-15 18:04:18 -04:00
```console
$ uvx --from 'ruff>0.2.0,<0.3.0' ruff check
```
2024-07-19 10:26:54 -04:00
Note the `@` syntax cannot be used for anything other than an exact version.
## Requesting extras
The `--from` option can be used to run a tool with extras:
```console
$ uvx --from 'mypy[faster-cache,reports]' mypy --xml-report mypy_report
```
This can also be combined with version selection:
```console
$ uvx --from 'mypy[faster-cache,reports]==1.13.0' mypy --xml-report mypy_report
```
2024-07-15 18:04:18 -04:00
## Requesting different sources
The `--from` option can also be used to install from alternative sources.
For example, to pull from git:
2024-07-15 18:04:18 -04:00
```console
$ uvx --from git+https://github.com/httpie/cli httpie
```
You can also pull the latest commit from a specific named branch:
```console
$ uvx --from git+https://github.com/httpie/cli@master httpie
```
Or pull a specific tag:
```console
$ uvx --from git+https://github.com/httpie/cli@3.2.4 httpie
```
Or even a specific commit:
```console
$ uvx --from git+https://github.com/httpie/cli@2843b87 httpie
```
2024-07-15 18:04:18 -04:00
## Commands with plugins
Additional dependencies can be included, e.g., to include `mkdocs-material` when running `mkdocs`:
```console
$ uvx --with mkdocs-material mkdocs --help
```
## Installing tools
If a tool is used often, it is useful to install it to a persistent environment and add it to the
`PATH` instead of invoking `uvx` repeatedly.
2024-07-15 18:04:18 -04:00
!!! tip
`uvx` is a convenient alias for `uv tool run`. All of the other commands for interacting with
tools require the full `uv tool` prefix.
2024-07-15 18:04:18 -04:00
To install `ruff`:
```console
$ uv tool install ruff
```
When a tool is installed, its executables are placed in a `bin` directory in the `PATH` which allows
the tool to be run without uv. If it's not on the `PATH`, a warning will be displayed and
`uv tool update-shell` can be used to add it to the `PATH`.
2024-07-15 18:04:18 -04:00
After installing `ruff`, it should be available:
```console
$ ruff --version
```
Unlike `uv pip install`, installing a tool does not make its modules available in the current
environment. For example, the following command will fail:
2024-07-15 18:04:18 -04:00
```console
$ python -c "import ruff"
```
This isolation is important for reducing interactions and conflicts between dependencies of tools,
scripts, and projects.
2024-07-15 18:04:18 -04:00
Unlike `uvx`, `uv tool install` operates on a _package_ and will install all executables provided by
the tool.
2024-07-15 18:04:18 -04:00
For example, the following will install the `http`, `https`, and `httpie` executables:
```console
$ uv tool install httpie
```
Additionally, package versions can be included without `--from`:
```console
$ uv tool install 'httpie>0.1.0'
```
2024-07-19 15:24:43 -04:00
And, similarly, for package sources:
2024-07-15 18:04:18 -04:00
```console
$ uv tool install git+https://github.com/httpie/cli
```
2024-07-19 15:24:43 -04:00
As with `uvx`, installations can include additional packages:
```console
$ uv tool install mkdocs --with mkdocs-material
```
2024-08-09 09:19:38 -04:00
## Upgrading tools
To upgrade a tool, use `uv tool upgrade`:
```console
$ uv tool upgrade ruff
```
Tool upgrades will respect the version constraints provided when installing the tool. For example,
`uv tool install ruff >=0.3,<0.4` followed by `uv tool upgrade ruff` will upgrade Ruff to the latest
version in the range `>=0.3,<0.4`.
To instead replace the version constraints, re-install the tool with `uv tool install`:
```console
$ uv tool install ruff>=0.4
```
To instead upgrade all tools:
```console
$ uv tool upgrade --all
```
## Requesting Python versions
2025-06-11 02:15:38 +08:00
By default, uv will use your default Python interpreter (the first it finds) when running,
installing, or upgrading tools. You can specify the Python interpreter to use with the `--python`
option.
For example, to request a specific Python version when running a tool:
```console
$ uvx --python 3.10 ruff
```
Or, when installing a tool:
```console
$ uv tool install --python 3.10 ruff
```
Or, when upgrading a tool:
```console
$ uv tool upgrade --python 3.10 ruff
```
For more details on requesting Python versions, see the
2025-06-11 02:15:38 +08:00
[Python version](../concepts/python-versions.md#requesting-a-version) concept page.
## Legacy Windows Scripts
Tools also support running
[legacy setuptools scripts](https://packaging.python.org/en/latest/guides/distributing-packages-using-setuptools/#scripts).
These scripts are available via `$(uv tool dir)\<tool-name>\Scripts` when installed.
Currently only legacy scripts with the `.ps1`, `.cmd`, and `.bat` extensions are supported.
For example, below is an example running a Command Prompt script.
```console
$ uv tool run --from nuitka==2.6.7 nuitka.cmd --version
```
In addition, you don't need to specify the extension. `uvx` will automatically look for files ending
in `.ps1`, `.cmd`, and `.bat` in that order of execution on your behalf.
```console
$ uv tool run --from nuitka==2.6.7 nuitka --version
```
2024-07-19 15:24:43 -04:00
## Next steps
To learn more about managing tools with uv, see the [Tools concept](../concepts/tools.md) page and
the [command reference](../reference/cli.md#uv-tool).
2024-08-05 16:12:37 -05:00
2025-01-12 18:07:04 +03:00
Or, read on to learn how to [work on projects](./projects.md).