Uvenv
uvenv: pipx for uv (🦀) on Linux and macOS
Install / Use
/learn @robinvandernoord/UvenvREADME
uvenv: pipx for uv
Inspired by:
Installation
New:
uvenvis now also installable via the snap store.
Thepipmethod is still recommended, but if you want to usesnap, please check out docs/snap.md!
- Install via pip (or alternatives):
pip install uvenv # or `uv install uvenv`, `pipx install uvenv`
Note: On some systems (e.g., Ubuntu 24.04+), global installation via pip is restricted by default. The recommended way to install
uvenvfor these systems is to use theinstall.shscript:$SHELL -c "$(curl -fsSL https://raw.githubusercontent.com/robinvandernoord/uvenv/uvenv/install.sh)" # instead of `$SHELL`, you can also use `sh`, `bash`, `zsh` > ``` For more installation alternatives, see [docs/installation.md](docs/installation.md) if you encounter `externally-managed-environment` errors.
-
Optional (for bash users):
uvenv setupThis installs the following features:
- Ensures
~/.local/bin/is added to your PATH, so commands can be found (unless--skip-ensurepath). Can also be activated viauvenv ensurepath - Enables tab completion for
uvenv(unless--skip-completions). Can also be enabled viauvenv completions --install. - Enables
uvenv activate(unless--skip-activate) to activate uvenv-managed virtualenvs from your shell
Usage
uvenv
Most pipx commands are supported, such as install, upgrade inject, run, runpip.
Run uvenv without any arguments to see all possible subcommands.
🆕 Freeze and Thaw
You can snapshot your current setup into a uvenv.lock file using:
uvenv freeze
This lock file records all installed applications along with their metadata — including version, Python version, and any injected dependencies.
Later, you can restore that exact setup using:
uvenv thaw
This is useful for replicating the same setup on a different machine, or after a clean install or system update.
Lock file formats
The uvenv.lock file can be saved in one of the following formats:
- TOML (default): human-readable and easy to edit
- JSON: more verbose, but script-friendly (e.g. with
jq) - Binary: compact, but not human-readable
Choose the format using the --format flag:
uvenv freeze --format json
See docs/lockfile_v1.md for details on the file format, including all supported options and examples.
Selective freeze/thaw
Use --include or --exclude to control which apps get recorded or restored:
uvenv freeze --exclude some-app
uvenv thaw --include only-this-app
For all available options, see:
uvenv freeze --help
uvenv thaw --help
Migrating from uvx and Comparing with uv tool
Migrating from uvx
The tool previously named uvx is now uvenv due to a naming collision with a new uv command. The new name better reflects its purpose, combining uv with venv.
You can run uvenv self migrate to move your environments and installed commands from uvx to uvenv.
How uvenv differs from uv tool
While both uvenv and uv tool (a subcommand of uv) offer overlapping functionality for installing and running Python applications, they differ in purpose and approach:
- Interface:
uvenvis modeled afterpipx, offering commands likeinstall,inject,run,upgrade, andrunpip. If you're already used topipx,uvenvis a near drop-in replacement. - Inject support:
uvenvsupportspipx'sinjectfunctionality, which lets you add extra packages to an app’s environment — helpful for plugins, linters, or testing tools.uv tooldoes not currently support this. - Compatibility:
uvenvusesuvfor dependency resolution and installation, benefiting from its speed and correctness. It also respectsuv's configuration files (such as~/.config/uv/uv.tomland/etc/uv/uv.toml, see uv config docs) unless the environment variableUV_NO_CONFIG=1is set to ignore them.
In short:
- Use
uvenvif you wantpipx-style workflows with advanced management features. - Use
uv toolif you prefer a minimal approach for running tools quickly - for most basic use-cases,uv toolis probably sufficient.
Platform Considerations
- Rust-Powered Performance (uvenv 2.0): Starting from version 2.0,
uvenvleverages Rust for improved performance and compatibility withuv. - Prebuilt Binaries: Currently, prebuilt binaries are available for x86_64 (amd64) and aarch64 (ARM64) on Linux, as well as Intel (x86_64) and Apple Silicon (ARM64) on macOS.
- Other Platforms: If you're on a different platform, you can still use
uvx 1.x, which is written in pure Python. Find it at robinvandernoord/uvx. - Alternatively, you can Compile for Your Platform:
- Install the Rust toolchain:
curl https://sh.rustup.rs -sSf | sh - Clone the
uvenvrepo and navigate to it:git clone https://github.com/robinvandernoord/uvenv.git cd uvenv - Set up a virtual environment (choose Python or uv):
python -m venv venv # or `uv venv venv --seed` source venv/bin/activate - Install Maturin (Python with Rust package builder):
pip install maturin # or `uv pip install maturin` - Compile and install the
uvenvbinary:maturin develop - Now you can use
uvenv:./venv/bin/uvenv
- Install the Rust toolchain:
For additional details on building and distribution, refer to maturin documentation.
License
uvenv is distributed under the terms of the MIT license.
Changelog
See CHANGELOG.md on GitHub
Related Skills
himalaya
348.5kCLI to manage emails via IMAP/SMTP. Use `himalaya` to list, read, write, reply, forward, search, and organize emails from the terminal. Supports multiple accounts and message composition with MML (MIME Meta Language).
node-connect
348.5kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
taskflow
348.5kname: taskflow description: Use when work should span one or more detached tasks but still behave like one job with a single owner context. TaskFlow is the durable flow substrate under authoring layer
claude-opus-4-5-migration
109.1kMigrate prompts and code from Claude Sonnet 4.0, Sonnet 4.5, or Opus 4.1 to Opus 4.5
