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
151 lines
6 KiB
Markdown
151 lines
6 KiB
Markdown
# Using Python environments
|
|
|
|
Each Python installation has an environment that is active when Python is used. Packages can be
|
|
installed into an environment to make their modules available from your Python scripts. Generally,
|
|
it is considered best practice not to modify a Python installation's environment. This is especially
|
|
important for Python installations that come with the operating system which often manage the
|
|
packages themselves. A virtual environment is a lightweight way to isolate packages from a Python
|
|
installation's environment. Unlike `pip`, uv requires using a virtual environment by default.
|
|
|
|
## Creating a virtual environment
|
|
|
|
uv supports creating virtual environments, e.g., to create a virtual environment at `.venv`:
|
|
|
|
```console
|
|
$ uv venv
|
|
```
|
|
|
|
A specific name or path can be specified, e.g., to create a virtual environment at `my-name`:
|
|
|
|
```console
|
|
$ uv venv my-name
|
|
```
|
|
|
|
A Python version can be requested, e.g., to create a virtual environment with Python 3.11:
|
|
|
|
```console
|
|
$ uv venv --python 3.11
|
|
```
|
|
|
|
Note this requires the requested Python version to be available on the system. However, if
|
|
unavailable, uv will download Python for you. See the
|
|
[Python version](../concepts/python-versions.md) documentation for more details.
|
|
|
|
## Using a virtual environment
|
|
|
|
When using the default virtual environment name, uv will automatically find and use the virtual
|
|
environment during subsequent invocations.
|
|
|
|
```console
|
|
$ uv venv
|
|
|
|
$ # Install a package in the new virtual environment
|
|
$ uv pip install ruff
|
|
```
|
|
|
|
The virtual environment can be "activated" to make its packages available:
|
|
|
|
=== "macOS and Linux"
|
|
|
|
```console
|
|
$ source .venv/bin/activate
|
|
```
|
|
|
|
=== "Windows"
|
|
|
|
```pwsh-session
|
|
PS> .venv\Scripts\activate
|
|
```
|
|
|
|
!!! note
|
|
|
|
The default activation script on Unix is for POSIX compliant shells like `sh`, `bash`, or `zsh`.
|
|
There are additional activation scripts for common alternative shells.
|
|
|
|
=== "fish"
|
|
|
|
```console
|
|
$ source .venv/bin/activate.fish
|
|
```
|
|
|
|
=== "csh / tcsh"
|
|
|
|
|
|
```console
|
|
$ source .venv/bin/activate.csh
|
|
```
|
|
|
|
=== "Nushell"
|
|
|
|
```console
|
|
$ use .venv\Scripts\activate.nu
|
|
```
|
|
|
|
## Deactivating an environment
|
|
|
|
To exit a virtual environment, use the `deactivate` command:
|
|
|
|
```console
|
|
$ deactivate
|
|
```
|
|
|
|
## Using arbitrary Python environments
|
|
|
|
Since uv has no dependency on Python, it can install into virtual environments other than its own.
|
|
For example, setting `VIRTUAL_ENV=/path/to/venv` will cause uv to install into `/path/to/venv`,
|
|
regardless of where uv is installed. Note that if `VIRTUAL_ENV` is set to a directory that is
|
|
**not** a [PEP 405 compliant](https://peps.python.org/pep-0405/#specification) virtual environment,
|
|
it will be ignored.
|
|
|
|
uv can also install into arbitrary, even non-virtual environments, with the `--python` argument
|
|
provided to `uv pip sync` or `uv pip install`. For example,
|
|
`uv pip install --python /path/to/python` will install into the environment linked to the
|
|
`/path/to/python` interpreter.
|
|
|
|
For convenience, `uv pip install --system` will install into the system Python environment. Using
|
|
`--system` is roughly equivalent to `uv pip install --python $(which python)`, but note that
|
|
executables that are linked to virtual environments will be skipped. Although we generally recommend
|
|
using virtual environments for dependency management, `--system` is appropriate in continuous
|
|
integration and containerized environments.
|
|
|
|
The `--system` flag is also used to opt in to mutating system environments. For example, the
|
|
`--python` argument can be used to request a Python version (e.g., `--python 3.12`), and uv will
|
|
search for an interpreter that meets the request. If uv finds a system interpreter (e.g.,
|
|
`/usr/lib/python3.12`), then the `--system` flag is required to allow modification of this
|
|
non-virtual Python environment. Without the `--system` flag, uv will ignore any interpreters that
|
|
are not in virtual environments. Conversely, when the `--system` flag is provided, uv will ignore
|
|
any interpreters that _are_ in virtual environments.
|
|
|
|
Installing into system Python across platforms and distributions is notoriously difficult. uv
|
|
supports the common cases, but will not work in all cases. For example, installing into system
|
|
Python on Debian prior to Python 3.10 is unsupported due to the
|
|
[distribution's patching of `distutils` (but not `sysconfig`)](https://ffy00.github.io/blog/02-python-debian-and-the-install-locations/).
|
|
While we always recommend the use of virtual environments, uv considers them to be required in these
|
|
non-standard environments.
|
|
|
|
If uv is installed in a Python environment, e.g., with `pip`, it can still be used to modify other
|
|
environments. However, when invoked with `python -m uv`, uv will default to using the parent
|
|
interpreter's environment. Invoking uv via Python adds startup overhead and is not recommended for
|
|
general usage.
|
|
|
|
uv itself does not depend on Python, but it does need to locate a Python environment to (1) install
|
|
dependencies into the environment and (2) build source distributions.
|
|
|
|
## Discovery of Python environments
|
|
|
|
When running a command that mutates an environment such as `uv pip sync` or `uv pip install`, uv
|
|
will search for a virtual environment in the following order:
|
|
|
|
- An activated virtual environment based on the `VIRTUAL_ENV` environment variable.
|
|
- An activated Conda environment based on the `CONDA_PREFIX` environment variable.
|
|
- A virtual environment at `.venv` in the current directory, or in the nearest parent directory.
|
|
|
|
If no virtual environment is found, uv will prompt the user to create one in the current directory
|
|
via `uv venv`.
|
|
|
|
If the `--system` flag is included, uv will skip virtual environments search for an installed Python
|
|
version. Similarly, when running a command that does not mutate the environment such as
|
|
`uv pip compile`, uv does not _require_ a virtual environment — however, a Python interpreter is
|
|
still required. See the documentation on
|
|
[Python discovery](../concepts/python-versions.md#discovery-of-python-versions) for details on the
|
|
discovery of installed Python versions.
|