This article goes over the new python runtime and package dependency management tool uv.

TLDR

Python runtime and package management tool.

Installation uv and python

curl -LsSf https://astral.sh/uv/install.sh | sh

Now that uv is install you can install and manage different versions of python.

uv python install 3.13

You can install multiple versions of python packages and by adding a .python-version file at the root of your python project directory uv will automatically use that version of python for the project. This file can be updated to different python version and uv will either use that version of python or will raise an error and ask the user to install that version of python.

!!! Use images to demonstrate this behaviour.

Usage

uv offers a lot of features that I have not yet used while writing this article, so I’ll focus on my regular usage of this tool.

  1. Create the project directory
mkdir python-side-project-2025
cd python-side-project-2025
  1. Now that you are in the directory, you can initiate the uv project.
uv init

This creates three files in your dir.

  • README.md
  • hello.py
  • pyproject.toml

pytproject.toml file is what matters as it defines the python project.

  1. Start adding packages
uv add pandas

This will create the .venv environment and place all the packages and dependencies of all you packages in this folder. pyproject.toml file is also updated

[project]
name = "project"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.13"
dependencies = [
"pandas>=2.2.3",
]
  1. Activate the python environment
source .venv/bin/activate
  1. Add/Remove packages
uv add fastapi
[project]
name = "project"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.13"
dependencies = [
"fastapi>=0.115.8",
"pandas>=2.2.3",
]
uv remove fastapi
[project]
name = "project"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.13"
dependencies = [
"pandas>=2.2.3",
]

There is no need to sync the environment, these command add/remove packages on the go and stay synced with the python environment.

There is a lot of other features a consumer of this package can use like dev and group dependencies, I like to keep my workflow simple and these are the basic commands I have used to get things done in my python projects.

My pervious python ecosystem

Python eco-system was always a bit messy from installing the runtime itself to installing packages for different run times.

Conda

My first experince with a real package manager was with conda where I just did conda install. At that point I didn’t really understand Python virtual environment and was just happy that all the packages are getting installed in my **main** environment.

Eventually when I started working on different project where I needed different set of packages and had installed newer versions of the existing packages, it is then when I first experience the HELL.

Packages started to conflict, things that used to work stopped working and I had to just start creating and maintain new envs everywhere.

The worst part was that conda didn’t have all the packages for all the the runtime. So it wasn’t a complete solution.

Poetry and Pyenv

This combination of a python runtime manager and coupled with a more declaritive python package manager, it came to me like a lifesaver. I knew how to use the pyproject.toml file, things were much more declaritive and it working. I could just mention the python version in .python-version and things would run easily.

Shattering of the Rose Glass

Eventually I added a lot of packages 25+ which is somewhat standard in Python Data eco-system, it starts to get crowded and this is where poetry starts to fail gradually but surely.

Along with it not able to just migrate to a new version of python easily with a lot more struggling and fighting with the poetry.lock file.

Export to requirement.txt file didn’t work consitently for the environment to be replicated in dockermore on docker here.

Envrionment didn’t work cross platform, Windows poetry project would not resolve dependency to MacOS. When poetry did resolve all the packages it would take a long time or it could be stuck in a lookup loop.

This were not ideal and it wasn’t HELL but it wasn’t a ideal solution and still needed a thought before making any change to the environment.

uv

uv was the shining new tool that I heard about, that came as beacon of light to consolidate the runtime and package management for Python.

Could another standard be the final one? Standards

So what is actually better?

Runtime Installer

To start of with it can install and select the correct python runtime version. Don’t need another python installation tool to do this for me which is really nice. In combination with the .python-version file where the version can be declared for eg. 3.12.1, uv will pick the right version when activating the virtual environment.

Virtual Environment Location

Location of the virtual environment or the .venv folder, its right there. No longer do I need to wonder where the file are which space in being take by my venvs. This make sourcing the venv really easy.

source .venv/bin/activate

Speed

The speed at which uv resolved the dependency tree and then installs the packages is the best that I have ever seen. Never though it would be this fast.

All the benchmarks are on their Github website The most interesting one is the warm installation comparison. Warm installation

Cross Platform

uv.lock unlike other python management tools, this lock file works on cross-platform.