You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: docs/posts/2025/2025-08-26-python-uv-cheat-sheet.md
+96-33Lines changed: 96 additions & 33 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -7,22 +7,29 @@ categories:
7
7
comments: true
8
8
date:
9
9
created: 2025-08-26
10
+
updated: 2025-08-28
10
11
---
11
12
12
13
# Python uv cheat sheet
13
14
14
-
Python [UV](https://docs.astral.sh/uv/) common usage cheat sheet, but doesn't cover all the features.
15
+
Python [uv](https://docs.astral.sh/uv/) common usage cheat sheet, but doesn't cover all the features.
15
16
16
17
<!-- more -->
17
18
18
19
## Init project
19
20
20
-
```bash
21
-
# init new project with new folder
22
-
uv init my-project -p python3.13
21
+
uv init can have 3 templates: [`--app`](https://docs.astral.sh/uv/concepts/projects/init/#packaged-applications) (by default), [`--lib`](https://docs.astral.sh/uv/concepts/projects/init/#applications) and [`--package`](https://docs.astral.sh/uv/concepts/projects/init/#packaged-applications).
|`uv init my-project -p python3.13`| Init new project with new folder |
26
+
|`uv init -p python3.13`| Init an existing project with python3.13 |
27
+
|`uv init --lib`| Libraries template creates a src folder whereas application template only creates a main.py file |
28
+
|`uv init --package`| Init a project with package template, same as libraries but pyproject.toml has a `[project.scripts]` key, so this is for command-line interface you can later run the command by: `uv run pkg-1`|
23
29
24
-
# init an existing project
25
-
uv init -p python3.13
30
+
```toml title="pyproject.toml created by uv init --package pkg-1"
31
+
[project.scripts]
32
+
pkg-1 = "pkg_1:main"
26
33
```
27
34
28
35
!!! warning "uv init under a folder with already a pyproject.toml"
@@ -39,7 +46,7 @@ Ref:
39
46
40
47
> `optional-dependencies` are part of the published metadata for your package, while `dependency-groups` are only visible when working with your package locally
41
48
42
-
### Add to dependencies
49
+
### Add to project.dependencies as main dependencies
43
50
44
51
```bash
45
52
uv add fastapi
@@ -56,10 +63,10 @@ dependencies = [
56
63
]
57
64
```
58
65
59
-
### Add to optionaldependencies as extra packages
66
+
### Add to project.optional-dependencies as extra packages
60
67
61
68
```bash
62
-
uv add ruff --optional aio
69
+
uv add aiohttp --optional aio
63
70
```
64
71
65
72
Could be installed by end users with `uv pip install temp[aio]`
@@ -74,7 +81,7 @@ aio = [
74
81
]
75
82
```
76
83
77
-
### Add to dependencygroups
84
+
### Add to dependency-groups for local development
78
85
79
86
```bash
80
87
uv add ruff --dev
@@ -100,6 +107,27 @@ typing = [
100
107
101
108
```
102
109
110
+
### Add to dependency sources
111
+
112
+
[Dependency sources](https://docs.astral.sh/uv/concepts/projects/dependencies/#dependency-sources) are for local development only.
|`uv sync --no-dev`| Install [dependencies](https://docs.astral.sh/uv/concepts/projects/dependencies/#project-dependencies) only (without any extra nor any group) |
175
+
|`uv sync`| Install dependencies and `dev` group, no extras, no other groups than `dev`|
176
+
|`uv sync --all-groups`| Install dependencies and all groups ([`dependency-groups`](https://docs.astral.sh/uv/concepts/projects/dependencies/#dependency-groups)) |
177
+
|`uv sync --all-extras`| Install dependencies and all extras ([`project.optional-dependencies`](https://docs.astral.sh/uv/concepts/projects/dependencies/#optional-dependencies)) and `dev` group (`dev` group is by default) |
178
+
|`uv sync --all-extras --all-groups`| Install dependencies and all extras and all groups |
179
+
|`uv sync --extra aio`| Install dependencies and extra `aio` and `dev` group |
180
+
|`uv sync --extra aio --no-dev`| Install dependencies and extra `aio` but without `dev` group |
181
+
|`uv sync --extra aio --inexact`| Install dependencies and `dev` groups and retain already installed [extraneous packages](https://docs.astral.sh/uv/concepts/projects/sync/#retaining-extraneous-packages) not declared in pyproject.toml |
182
+
|`uv sync --locked --no-dev`| Ensure install by respecting `uv.lock` (ensure uv.lock won't be changed after uv sync) and raise an error if lock file doesn't confirm with pyproject.toml.<br/><br/>In 🐳 Dockerfile ([official uv Dockerfile example](https://github.com/astral-sh/uv-docker-example/blob/main/Dockerfile)), we often use `uv sync --locked --no-install-project --no-dev`, see [Using uv in Docker](https://docs.astral.sh/uv/guides/integration/docker/) to understand the usage of each parameters. |
183
+
|||
152
184
153
-
- Ensure install by respecting `uv.lock` (ensure uv.lock won't be changed after uv sync) and raise error if lock file doesn't conform with pyproject.toml: `uv sync --locked --no-dev`, in Dockerfile ([official uv Dockerfile example](https://github.com/astral-sh/uv-docker-example/blob/main/Dockerfile)), we often use `uv sync --locked --no-install-project --no-dev`, see [Using uv in Docker](https://docs.astral.sh/uv/guides/integration/docker/) to understand the usage of each parameters.
185
+
```bash
186
+
$ uv sync --locked --no-dev
187
+
Resolved 21 packages in 33ms
188
+
The lockfile at `uv.lock` needs to be updated, but `--locked` was provided.
189
+
To update the lockfile, run `uv lock`.
190
+
```
191
+
192
+
### `--locked` vs `--frozen` vs `--no-sync`
193
+
194
+
official doc: https://docs.astral.sh/uv/concepts/projects/sync/#automatic-lock-and-sync
195
+
196
+
`uv.lock` file related:
154
197
155
-
```bash
156
-
$ uv sync --locked --no-dev
157
-
Resolved 21 packages in 33ms
158
-
The lockfile at `uv.lock` needs to be updated, but `--locked` was provided. To update the lockfile, run `uv lock`.
159
-
```
198
+
-`--locked`: If the lockfile is not up-to-date, uv will raise an error instead of updating the lockfile. `--locked` could be considered as `--ensure-locked`.
199
+
-`--frozen`: Use the lockfile without checking if it is up-to-date, no error will be raised.
200
+
201
+
`venv` related:
202
+
203
+
-`--no-sync`: Do not update the venv.
160
204
161
205
## Dependencies tree
162
206
163
-
- `uv pip tree`: display the **installed packages**in a tree format.
164
-
- `uv tree`: update `uv.lock` based on `pyproject.toml` and display tree based on `uv.lock`, **no package installation will occur**. `uv tree` displays better than `uv tree pip tree`
165
-
- `uv tree --frozen`: don't update `uv.lock`, just display tree based on the current `uv.lock`
166
-
- `uv tree --locked`: if `uv.lock` is not updated, display a warning message. This command is not very useful.
|`uv pip tree`| Display the **installed packages** in a tree format |
210
+
|`uv tree`| Update `uv.lock` based on `pyproject.toml` and display tree based on `uv.lock`, **no package installation will occur**. `uv tree` displays better than `uv pip tree`|
211
+
|`uv tree --frozen`| Don't update `uv.lock`, just display tree based on the current `uv.lock`|
212
+
|`uv tree --locked`| If `uv.lock` is not updated, display a warning message. This command is not very useful |
167
213
168
214
## List outdated packages
169
215
170
-
- `uv tree --outdated`: display a list of outdated packages with their latest versions.
216
+
-`uv tree --outdated`: display a list of outdated packages with their latest **public** versions, no matter what `pyproject.toml` declares.
217
+
-[`uv lock --check`](https://docs.astral.sh/uv/concepts/projects/sync/#checking-if-the-lockfile-is-up-to-date): check if `uv.lock` is up-to-date with `pyproject.toml`.
171
218
172
219
## Upgrade packages and uv.lock
173
220
174
-
- `uv lock`: update the `uv.lock` file to match the current state of `pyproject.toml`.
175
-
- `uv lock -U`: update the `uv.lock` file and upgrade all packages to their latest compatible versions.
176
-
- `uv sync`: same as `uv lock` but also installs the dependencies.
177
-
- `uv sync -U`: same as `uv lock -U` but also installs the dependencies.
221
+
[`uv.lock` file](https://docs.astral.sh/uv/concepts/projects/layout/#the-lockfile)can be updated by `uv lock`, `uv sync`, `uv run`, `uv add`, `uv remove`.
|`uv lock`| Update the `uv.lock` file to match the current state of `pyproject.toml`|
226
+
|`uv lock -U`| Update the `uv.lock` file and [upgrade](https://docs.astral.sh/uv/concepts/projects/sync/#upgrading-locked-package-versions) all packages to their latest compatible versions |
227
+
|`uv sync`| Same as `uv lock` but also installs the dependencies |
228
+
|`uv sync -U`| Same as `uv lock -U` but also installs the dependencies |
178
229
179
230
!!! note "`uv lock` vs `uv lock -U` and `uv sync` vs `uv sync -U`"
180
231
If latest version of fastapi is 0.116.1, and pyproject.toml declares fastapi>=0.115.1, and current uv.lock has fastapi==0.115.1. then:
@@ -184,6 +235,18 @@ all = [
184
235
185
236
Same logic applies to `uv sync` and `uv sync -U`, except for `sync` installing the dependencies too.
186
237
238
+
`-U` (`--upgrade` for all packages) or `-P` (`--upgrade-package` for a specific package) respect always the version constraints defined in `pyproject.toml`.
239
+
187
240
## Integrations
188
241
189
242
Check [this doc](https://docs.astral.sh/uv/guides/integration/) for more information on integrations with other tools and platforms (Docker, Jupyter, Github Actions, Pre Commit, PyTorch FastAPI, etc.).
243
+
244
+
## Build
245
+
246
+
### Build with rust, C, C++, CPython backend
247
+
248
+
uv can also [build with extension module by `--build-backend` flag](https://docs.astral.sh/uv/concepts/projects/init/#projects-with-extension-modules) to work with Rust and C, C++, CPython etc.
249
+
250
+
### Build isolation
251
+
252
+
uv build isolation is by default, but some packages need to [build against the same version of some packages installed in the project environment](https://docs.astral.sh/uv/concepts/projects/config/#build-isolation). For example, [flask-attn](https://pypi.org/project/flash-attn/), [deepspeed](https://pypi.org/project/deepspeed/), [cchardet](https://pypi.org/project/cchardet/), etc.
0 commit comments