When should I choose pixi over uv?
uv and pixi solve overlapping problems with different scope. Both create project-local environments and generate lockfiles. The difference is what they can install. uv pulls from PyPI (plus Git, URL, and path sources). Pixi pulls from conda channels (typically conda-forge) and PyPI, which means it can install system-level dependencies and non-Python software that PyPI does not distribute.
The short version: if you need conda packages, pixi is the better fit. If you don’t, uv is simpler.
What conda-forge gives you that PyPI cannot
PyPI distributes Python packages. Many of those packages include compiled extensions (NumPy, pandas, scikit-learn), and modern wheels handle this well for common platforms. But some software either does not exist on PyPI or requires system libraries that wheels cannot bundle:
- GPU toolkits: CUDA, cuDNN. PyPI packages like PyTorch bundle their own CUDA runtime, but this inflates install size and limits version control. Conda packages link against a shared CUDA toolkit managed by the solver. (Some GPU packages like TensorRT require the
nvidiachannel rather than conda-forge.) - Geospatial libraries: GDAL, PROJ, GEOS. The Python bindings on PyPI require these C/C++ libraries to be installed separately. On conda-forge,
pixi add gdalinstalls the library and its runtime dependencies together. - Scientific computing: HDF5, NetCDF, FFTW, MKL. These are C/Fortran libraries with Python wrappers. PyPI packages like
h5pyandnetCDF4exist but may require system-level libraries on some platforms. Conda-forge bundles the native libraries alongside the Python bindings. - Non-Python languages: R, Julia, Node.js. Pixi can manage these alongside Python in a single environment.
If your dependency list is pure Python or uses packages with good wheel support, these advantages do not apply. uv will be simpler.
How the tools compare
Package sources
uv resolves against PyPI, private indexes, and other sources (Git URLs, local paths, workspace members). Pixi resolves against configured conda channels first, then uses uv internally to resolve any additional PyPI dependencies. This two-phase resolution means pixi can mix conda and PyPI packages in one environment while ensuring they stay compatible.
Project configuration
uv uses standard pyproject.toml with PEP 621 metadata. The [project] table is portable to any PEP 621-compliant tool, though real uv projects often use uv-specific sections ([tool.uv.sources], [tool.uv.index]) that other tools ignore.
Pixi uses pixi.toml by default. It can also use pyproject.toml with pixi-specific configuration under [tool.pixi]. The standard [project] metadata remains portable to other Python tools, but conda dependency sections and pixi task definitions are not. If you later decide to drop pixi, you’ll need to convert those pixi-specific parts.
Environment model
Both tools create project-local environments. uv puts a .venv directory in the project root. Pixi puts a .pixi directory there. The difference is that pixi environments can contain non-Python software (compilers, system libraries, CLI tools from conda-forge), while uv environments contain only Python packages.
Pixi also supports multiple named environments from a single manifest through its “features” system. A project can define a test environment with pytest and a cuda environment with GPU packages, each with its own resolved dependency set. uv supports dependency groups (PEP 735) but not fully independent environments from one manifest.
Cross-platform lockfiles
Both tools generate cross-platform lockfiles. uv resolves for all platforms in uv.lock. Pixi resolves for all platforms in pixi.lock, covering both conda and PyPI dependencies. Pixi lock files tend to be larger because they include conda package metadata for each target platform.
Task runner
Pixi has a built-in task runner. Tasks defined in pixi.toml can depend on other tasks and set environment variables:
[tasks]
lint = "ruff check ."
test = { cmd = "pytest", depends-on = ["lint"] }uv has no task runner. Most uv projects use Makefiles, shell scripts, or tools like nox or tox.
Tool execution
uv provides uvx for running Python CLI tools in temporary environments. Pixi provides pixi exec for a similar workflow, but pixi exec can install from conda channels as well as PyPI. Both also support permanent global tool installs (uv tool install, pixi global install).
Community and adoption
uv has broader adoption across the Python ecosystem, with more users, documentation, and editor/CI integration. Pixi’s adoption is concentrated in scientific computing, ML, and bioinformatics, where conda-forge dependencies are common.
Standards alignment
uv follows Python packaging standards (PEP 621, PEP 508, PEP 735). Projects configured for uv work with other standards-compliant tools.
Pixi follows conda ecosystem conventions. Its dependency specifications use conda’s version syntax for conda packages and PEP 508 for PyPI packages. A pixi.toml project cannot be used with pip, uv, or poetry without conversion. A pyproject.toml-based pixi project keeps its standard [project] metadata portable, but the [tool.pixi.*] sections and conda dependencies are pixi-specific.
When to choose pixi
- Your project needs CUDA, GDAL, HDF5, OpenCV, or other native libraries that conda-forge provides
- You work with non-Python languages (R, Julia, C++) in the same environment
- You want a single lock file covering both conda and PyPI dependencies across platforms
- Your team already uses conda-forge and wants a project-local workflow to replace
conda activate
When to choose uv
- Your project is pure Python or uses packages with good PyPI wheel support
- You want standard
pyproject.tomlconfiguration that works with any PEP 621 tool - You want the broadest community support and documentation
- You’re building a Python library intended for PyPI distribution
Can you use both?
Yes. Pixi uses uv internally for PyPI resolution, so they share design philosophy. Some teams use uv for pure Python projects and pixi for projects that need conda-forge packages. The workflow is similar enough that switching between them requires little context-shifting.
Learn more
- pixi reference page
- uv reference page
- Why should I choose conda?
- Understanding the conda/Anaconda ecosystem
Also Mentioned In
Get Python tooling updates
Subscribe to the newsletter