mirror of
https://github.com/astral-sh/uv.git
synced 2025-08-04 10:58:28 +00:00

Some checks are pending
CI / build binary | linux musl (push) Blocked by required conditions
CI / build binary | macos aarch64 (push) Blocked by required conditions
CI / check system | alpine (push) Blocked by required conditions
CI / smoke test | macos (push) Blocked by required conditions
CI / smoke test | windows x86_64 (push) Blocked by required conditions
CI / smoke test | windows aarch64 (push) Blocked by required conditions
CI / integration test | conda on ubuntu (push) Blocked by required conditions
CI / integration test | deadsnakes python3.9 on ubuntu (push) Blocked by required conditions
CI / integration test | free-threaded on linux (push) Blocked by required conditions
CI / build binary | macos x86_64 (push) Blocked by required conditions
CI / build binary | windows x86_64 (push) Blocked by required conditions
CI / build binary | windows aarch64 (push) Blocked by required conditions
CI / cargo build (msrv) (push) Blocked by required conditions
CI / build binary | freebsd (push) Blocked by required conditions
CI / ecosystem test | pydantic/pydantic-core (push) Blocked by required conditions
CI / ecosystem test | prefecthq/prefect (push) Blocked by required conditions
CI / ecosystem test | pallets/flask (push) Blocked by required conditions
CI / smoke test | linux (push) Blocked by required conditions
CI / check cache | macos aarch64 (push) Blocked by required conditions
CI / check system | graalpy on ubuntu (push) Blocked by required conditions
CI / check system | pypy on ubuntu (push) Blocked by required conditions
CI / integration test | free-threaded on windows (push) Blocked by required conditions
CI / integration test | pypy on windows (push) Blocked by required conditions
CI / integration test | graalpy on ubuntu (push) Blocked by required conditions
CI / integration test | graalpy on windows (push) Blocked by required conditions
CI / integration test | github actions (push) Blocked by required conditions
CI / integration test | free-threaded python on github actions (push) Blocked by required conditions
CI / integration test | determine publish changes (push) Blocked by required conditions
CI / integration test | uv publish (push) Blocked by required conditions
CI / integration test | uv_build (push) Blocked by required conditions
CI / check cache | ubuntu (push) Blocked by required conditions
CI / check system | python on debian (push) Blocked by required conditions
CI / check system | python on fedora (push) Blocked by required conditions
CI / check system | python on ubuntu (push) Blocked by required conditions
CI / check system | python on opensuse (push) Blocked by required conditions
CI / check system | python on rocky linux 8 (push) Blocked by required conditions
CI / check system | python on rocky linux 9 (push) Blocked by required conditions
CI / check system | pyston (push) Blocked by required conditions
CI / check system | python on macos aarch64 (push) Blocked by required conditions
CI / check system | homebrew python on macos aarch64 (push) Blocked by required conditions
CI / check system | python on macos x86-64 (push) Blocked by required conditions
CI / check system | python3.10 on windows x86-64 (push) Blocked by required conditions
CI / check system | python3.10 on windows x86 (push) Blocked by required conditions
CI / check system | python3.13 on windows x86-64 (push) Blocked by required conditions
CI / check system | x86-64 python3.13 on windows aarch64 (push) Blocked by required conditions
CI / check system | windows registry (push) Blocked by required conditions
CI / check system | python3.12 via chocolatey (push) Blocked by required conditions
CI / check system | python3.9 via pyenv (push) Blocked by required conditions
CI / check system | python3.13 (push) Blocked by required conditions
CI / check system | conda3.11 on macos aarch64 (push) Blocked by required conditions
CI / check system | conda3.8 on macos aarch64 (push) Blocked by required conditions
CI / check system | conda3.11 on linux x86-64 (push) Blocked by required conditions
CI / check system | conda3.8 on linux x86-64 (push) Blocked by required conditions
CI / check system | conda3.11 on windows x86-64 (push) Blocked by required conditions
CI / check system | conda3.8 on windows x86-64 (push) Blocked by required conditions
CI / check system | amazonlinux (push) Blocked by required conditions
CI / check system | embedded python3.10 on windows x86-64 (push) Blocked by required conditions
CI / benchmarks (push) Blocked by required conditions
CI / cargo shear (push) Waiting to run
CI / cargo test | ubuntu (push) Blocked by required conditions
CI / Determine changes (push) Waiting to run
CI / lint (push) Waiting to run
CI / cargo clippy | ubuntu (push) Blocked by required conditions
CI / cargo clippy | windows (push) Blocked by required conditions
CI / cargo dev generate-all (push) Blocked by required conditions
CI / cargo test | macos (push) Blocked by required conditions
CI / cargo test | windows (push) Blocked by required conditions
CI / check windows trampoline | aarch64 (push) Blocked by required conditions
CI / check windows trampoline | i686 (push) Blocked by required conditions
CI / build binary | linux libc (push) Blocked by required conditions
CI / check windows trampoline | x86_64 (push) Blocked by required conditions
CI / test windows trampoline | i686 (push) Blocked by required conditions
CI / test windows trampoline | x86_64 (push) Blocked by required conditions
CI / typos (push) Waiting to run
CI / mkdocs (push) Waiting to run
CI / integration test | pypy on ubuntu (push) Blocked by required conditions
<!-- Thank you for contributing to uv! To help us out with reviewing, please consider the following: - Does this pull request include a summary of the change? (See below.) - Does this pull request include a descriptive title? - Does this pull request include references to any relevant issues? --> ## Summary The PowerShell prompt is not `$`, so it is not detected as a `Generic.Prompt` token by Pygments lexers. Therefore, the JavaScript code does not strip the prompt when copying from PowerShell code blocks, such as [here](https://docs.astral.sh/uv/getting-started/installation/#__tabbed_5_2). Other places in the docs have removed the prompt completely to address this issue: * https://docs.astral.sh/uv/guides/projects/#__tabbed_1_2 * https://docs.astral.sh/uv/guides/integration/jupyter/#__tabbed_1_2 This PR updates the PowerShell prompt to `PS>` and changes the code fence language to `pwsh-session` to match the lexer name from [Pygments](https://pygments.org/docs/lexers/#pygments.lexers.shell.PowerShellSessionLexer). This allows the prompt to be correctly detected as a `Generic.Prompt` token and is stripped during copy. Related: https://github.com/astral-sh/uv/pull/12520
243 lines
6.5 KiB
Markdown
243 lines
6.5 KiB
Markdown
---
|
|
title: Working on projects
|
|
description:
|
|
A guide to using uv to create and manage Python projects, including adding dependencies, running
|
|
commands, and building publishable distributions.
|
|
---
|
|
|
|
# Working on projects
|
|
|
|
uv supports managing Python projects, which define their dependencies in a `pyproject.toml` file.
|
|
|
|
## Creating a new project
|
|
|
|
You can create a new Python project using the `uv init` command:
|
|
|
|
```console
|
|
$ uv init hello-world
|
|
$ cd hello-world
|
|
```
|
|
|
|
Alternatively, you can initialize a project in the working directory:
|
|
|
|
```console
|
|
$ mkdir hello-world
|
|
$ cd hello-world
|
|
$ uv init
|
|
```
|
|
|
|
uv will create the following files:
|
|
|
|
```text
|
|
.
|
|
├── .python-version
|
|
├── README.md
|
|
├── main.py
|
|
└── pyproject.toml
|
|
```
|
|
|
|
The `main.py` file contains a simple "Hello world" program. Try it out with `uv run`:
|
|
|
|
```console
|
|
$ uv run main.py
|
|
Hello from hello-world!
|
|
```
|
|
|
|
## Project structure
|
|
|
|
A project consists of a few important parts that work together and allow uv to manage your project.
|
|
In addition to the files created by `uv init`, uv will create a virtual environment and `uv.lock`
|
|
file in the root of your project the first time you run a project command, i.e., `uv run`,
|
|
`uv sync`, or `uv lock`.
|
|
|
|
A complete listing would look like:
|
|
|
|
```text
|
|
.
|
|
├── .venv
|
|
│ ├── bin
|
|
│ ├── lib
|
|
│ └── pyvenv.cfg
|
|
├── .python-version
|
|
├── README.md
|
|
├── main.py
|
|
├── pyproject.toml
|
|
└── uv.lock
|
|
```
|
|
|
|
### `pyproject.toml`
|
|
|
|
The `pyproject.toml` contains metadata about your project:
|
|
|
|
```toml title="pyproject.toml"
|
|
[project]
|
|
name = "hello-world"
|
|
version = "0.1.0"
|
|
description = "Add your description here"
|
|
readme = "README.md"
|
|
dependencies = []
|
|
```
|
|
|
|
You'll use this file to specify dependencies, as well as details about the project such as its
|
|
description or license. You can edit this file manually, or use commands like `uv add` and
|
|
`uv remove` to manage your project from the terminal.
|
|
|
|
!!! tip
|
|
|
|
See the official [`pyproject.toml` guide](https://packaging.python.org/en/latest/guides/writing-pyproject-toml/)
|
|
for more details on getting started with the `pyproject.toml` format.
|
|
|
|
You'll also use this file to specify uv [configuration options](../configuration/files.md) in a
|
|
[`[tool.uv]`](../reference/settings.md) section.
|
|
|
|
### `.python-version`
|
|
|
|
The `.python-version` file contains the project's default Python version. This file tells uv which
|
|
Python version to use when creating the project's virtual environment.
|
|
|
|
### `.venv`
|
|
|
|
The `.venv` folder contains your project's virtual environment, a Python environment that is
|
|
isolated from the rest of your system. This is where uv will install your project's dependencies.
|
|
|
|
See the [project environment](../concepts/projects/layout.md#the-project-environment) documentation
|
|
for more details.
|
|
|
|
### `uv.lock`
|
|
|
|
`uv.lock` is a cross-platform lockfile that contains exact information about your project's
|
|
dependencies. Unlike the `pyproject.toml` which is used to specify the broad requirements of your
|
|
project, the lockfile contains the exact resolved versions that are installed in the project
|
|
environment. This file should be checked into version control, allowing for consistent and
|
|
reproducible installations across machines.
|
|
|
|
`uv.lock` is a human-readable TOML file but is managed by uv and should not be edited manually.
|
|
|
|
See the [lockfile](../concepts/projects/layout.md#the-lockfile) documentation for more details.
|
|
|
|
## Managing dependencies
|
|
|
|
You can add dependencies to your `pyproject.toml` with the `uv add` command. This will also update
|
|
the lockfile and project environment:
|
|
|
|
```console
|
|
$ uv add requests
|
|
```
|
|
|
|
You can also specify version constraints or alternative sources:
|
|
|
|
```console
|
|
$ # Specify a version constraint
|
|
$ uv add 'requests==2.31.0'
|
|
|
|
$ # Add a git dependency
|
|
$ uv add git+https://github.com/psf/requests
|
|
```
|
|
|
|
If you're migrating from a `requirements.txt` file, you can use `uv add` with the `-r` flag to add
|
|
all dependencies from the file:
|
|
|
|
```console
|
|
$ # Add all dependencies from `requirements.txt`.
|
|
$ uv add -r requirements.txt -c constraints.txt
|
|
```
|
|
|
|
To remove a package, you can use `uv remove`:
|
|
|
|
```console
|
|
$ uv remove requests
|
|
```
|
|
|
|
To upgrade a package, run `uv lock` with the `--upgrade-package` flag:
|
|
|
|
```console
|
|
$ uv lock --upgrade-package requests
|
|
```
|
|
|
|
The `--upgrade-package` flag will attempt to update the specified package to the latest compatible
|
|
version, while keeping the rest of the lockfile intact.
|
|
|
|
See the documentation on [managing dependencies](../concepts/projects/dependencies.md) for more
|
|
details.
|
|
|
|
## Running commands
|
|
|
|
`uv run` can be used to run arbitrary scripts or commands in your project environment.
|
|
|
|
Prior to every `uv run` invocation, uv will verify that the lockfile is up-to-date with the
|
|
`pyproject.toml`, and that the environment is up-to-date with the lockfile, keeping your project
|
|
in-sync without the need for manual intervention. `uv run` guarantees that your command is run in a
|
|
consistent, locked environment.
|
|
|
|
For example, to use `flask`:
|
|
|
|
```console
|
|
$ uv add flask
|
|
$ uv run -- flask run -p 3000
|
|
```
|
|
|
|
Or, to run a script:
|
|
|
|
```python title="example.py"
|
|
# Require a project dependency
|
|
import flask
|
|
|
|
print("hello world")
|
|
```
|
|
|
|
```console
|
|
$ uv run example.py
|
|
```
|
|
|
|
Alternatively, you can use `uv sync` to manually update the environment then activate it before
|
|
executing a command:
|
|
|
|
=== "macOS and Linux"
|
|
|
|
```console
|
|
$ uv sync
|
|
$ source .venv/bin/activate
|
|
$ flask run -p 3000
|
|
$ python example.py
|
|
```
|
|
|
|
=== "Windows"
|
|
|
|
```pwsh-session
|
|
PS> uv sync
|
|
PS> .venv\Scripts\activate
|
|
PS> flask run -p 3000
|
|
PS> python example.py
|
|
```
|
|
|
|
!!! note
|
|
|
|
The virtual environment must be active to run scripts and commands in the project without `uv run`. Virtual environment activation differs per shell and platform.
|
|
|
|
See the documentation on [running commands and scripts](../concepts/projects/run.md) in projects for
|
|
more details.
|
|
|
|
## Building distributions
|
|
|
|
`uv build` can be used to build source distributions and binary distributions (wheel) for your
|
|
project.
|
|
|
|
By default, `uv build` will build the project in the current directory, and place the built
|
|
artifacts in a `dist/` subdirectory:
|
|
|
|
```console
|
|
$ uv build
|
|
$ ls dist/
|
|
hello-world-0.1.0-py3-none-any.whl
|
|
hello-world-0.1.0.tar.gz
|
|
```
|
|
|
|
See the documentation on [building projects](../concepts/projects/build.md) for more details.
|
|
|
|
## Next steps
|
|
|
|
To learn more about working on projects with uv, see the
|
|
[projects concept](../concepts/projects/index.md) page and the
|
|
[command reference](../reference/cli.md#uv).
|
|
|
|
Or, read on to learn how to [build and publish your project to a package index](./package.md).
|