tox-uv is a tox plugin, which replaces virtualenv and pip with uv in your tox environments. Note that you
will get both the benefits (performance) or downsides (bugs) of uv.
- How to use
- tox environment types provided
- uv.lock support
- Environment creation
- Package installation
- uv_resolution
Install tox-uv into the environment of your tox, and it will replace virtualenv and pip for all runs:
uv tool install tox --with tox-uv # use uv to install
tox --version # validate you are using the installed tox
tox r -e py312 # will use uv
tox --runner virtualenv r -e py312 # will use virtualenv+pipThis package will provide the following new tox environments:
uv-venv-runneris the ID for the tox environments runner for environments not using a lock file.uv-venv-lock-runneris the ID for the tox environments runner for environments usinguv.lock(note we can’t detect the presence of theuv.lockfile to enable this because that would break environments not using the lock file - such as your linter).uv-venv-pep-517is the ID for the PEP-517 packaging environment.uv-venv-cmd-builderis the ID for the external cmd builder.
If you want for a tox environment to use uv sync with a uv.lock file you need to change for that tox environment the
runner to uv-venv-lock-runner. Furthermore, should in such environments you use the extras config to instruct uv
to install the specified extras, for example (this example is for the tox.ini, for other formats see the documentation
here):
[testenv:fix]
description = run code formatter and linter (auto-fix)
skip_install = true
deps =
pre-commit-uv>=4.1.1
commands =
pre-commit run --all-files --show-diff-on-failure
[testenv:type]
runner = uv-venv-lock-runner
description = run type checker via mypy
commands =
mypy {posargs:src}
[testenv:dev]
runner = uv-venv-lock-runner
description = dev environment
extras =
dev
test
type
commands =
uv pip treeIn this example:
fixwill use theuv-venv-runnerand useuv pip installto install dependencies to the environment.typewill use theuv-venv-lock-runnerand useuv syncto install dependencies to the environment without any extra group.devwill use theuv-venv-lock-runnerand useuv syncto install dependencies to the environment with thedev,testandtypeextra groups.
Note that when using uv-venv-lock-runner, all dependencies will come from the lock file, controlled by extras.
Therefore, options like deps are ignored (and all others
enumerated here as Python run flags).
How to install the source tree package, must be one of:
skip,wheel,editable(default),uv(use uv to install the project, rather than build wheel viatox),uv-editable(use uv to install the project in editable mode, rather than build wheel viatox).
You should use the latter two in case you need to use any non-standard features of uv, such as tool.uv.sources.
A list of string that selects, which extra groups you want to install with uv sync. By default, it is empty.
A boolean flag to toggle installation of the uv
default development groups. By default, it
will be true if the dependency_groups is not empty and false otherwise.
Specify PEP 735 – Dependency Groups to install.
A list of strings, containing additional flags to pass to uv sync (useful because some flags are not configurable via environment variables). For example, if you want to install the package in non editable mode and keep extra packages installed into the environment you can do:
uv_sync_flags = --no-editable, --inexactBy default tox-uv will call uv sync with --locked argument, which is incompatible with other arguments like
--prerelease or --upgrade that you might want to add to uv_sync_flags for some test scenarios. You can set this
to false to avoid such conflicts.
Should tox be invoked with the --installpkg flag
(the argument must be either a wheel or source distribution) the sync operation will run with --no-install-project
and uv pip install will be used afterward to install the provided package.
We use uv venv to create virtual environments. This process can be configured with the following options:
This flag, set on a tox environment level, controls if the created virtual environment injects pip, setuptools and
wheel into the created virtual environment or not. By default, it is off. You will need to set this if you have a
project that uses the old legacy-editable mode, or your project doesn’t support the pyproject.toml powered isolated
build model.
This flag, set on a tox environment level, controls how uv select the Python interpreter.
By default, uv will attempt to use Python versions found on the system and only download managed interpreters when
necessary. However, It is possible to adjust uv's Python version selection preference with the
python-preference option.
Create virtual environments that also have access to globally installed packages. Note the default value may be overwritten by the VIRTUALENV_SYSTEM_SITE_PACKAGES environment variable. This flag works the same way as the one from tox native virtualenv implementation.
We use uv pip to install packages into the virtual environment. The behavior of this can be configured via the
following options:
This flag, set on a tox environment level, informs uv of the desired resolution strategy:
highest- (default) selects the highest version of a package satisfying the constraints.lowest- install the lowest compatible versions for all dependencies, both direct and transitive.lowest-direct- opt for the lowest compatible versions for all direct dependencies, while using the latest compatible versions for all transitive dependencies.
This is an uv specific feature that may be used as an alternative to frozen constraints for test environments if the
intention is to validate the lower bounds of your dependencies during test executions.