uv/crates
Charlie Marsh c180fedbce
Run interpreter discovery under `-I` mode (#2552)
## Summary

If you have a file `typing.py` in the current working directory, `python
-m` doesn't work in some Python versions:

```sh
❯ python -m foo
Could not import runpy module
Traceback (most recent call last):
  File "/Users/crmarsh/.local/share/rtx/installs/python/3.9.18/lib/python3.9/runpy.py", line 15, in <module>
    import importlib.util
  File "/Users/crmarsh/.local/share/rtx/installs/python/3.9.18/lib/python3.9/importlib/util.py", line 2, in <module>
    from . import abc
  File "/Users/crmarsh/.local/share/rtx/installs/python/3.9.18/lib/python3.9/importlib/abc.py", line 17, in <module>
    from typing import Protocol, runtime_checkable
ImportError: cannot import name 'Protocol' from 'typing' (/Users/crmarsh/workspace/uv/typing.py)
```

This did _not_ cause problems for us on Python 3.11 or later, because we
set `PYTHONSAFEPATH`, which avoids adding the current working directory
to `sys.path`. However, on earlier versions, we _were_ failing with the
above. (It's important that we run interpreter discovery in the current
working directory, since doing otherwise breaks pyenv shims.)

The fix implemented here uses `-I` to run Python in isolated mode, which
is even stricter. The downside of isolated mode is that we currently
rely on setting `PYTHONPATH` to find the "fake module" that we create on
disk, and `-I` means `PYTHONPATH` is totally ignored. So, instead, we
run a script directly, and that _script_ injects the path we care about
into `PYTHONSAFEPATH`.

Closes https://github.com/astral-sh/uv/issues/2547.
2024-03-19 20:19:46 -04:00
..
bench Rename to `uv` (#1302) 2024-02-15 11:19:46 -06:00
cache-key Avoid panicking on cannot-be-a-base URLs (#2461) 2024-03-14 17:47:16 +00:00
distribution-filename Bump insta from 1.35.1 to 1.36.1 (#2180) 2024-03-04 23:01:49 +00:00
distribution-types Remove unused dependencies (#2543) 2024-03-19 13:10:10 -04:00
install-wheel-rs Remove unused dependencies (#2543) 2024-03-19 13:10:10 -04:00
once-map Remove unused deps (#1273) 2024-02-11 18:53:58 +00:00
pep440-rs Fast lint CI job: Rustfmt, Prettier, Ruff (#2406) 2024-03-20 00:16:46 +00:00
pep508-rs Allow direct file path requirements to include fragments (#2502) 2024-03-18 17:06:11 +00:00
platform-tags Drop `macosx_10_0` from compatible wheel tags on `aarch64` (#2496) 2024-03-18 14:52:54 +00:00
pypi-types Re-test validity after every lenient parsing change (#2550) 2024-03-19 15:41:49 -04:00
requirements-txt Remove unused dependencies (#2543) 2024-03-19 13:10:10 -04:00
uv Implement `--no-strip-extras` to preserve extras in compilation (#2555) 2024-03-19 23:59:32 +00:00
uv-auth chore: remove repetitive words (#2485) 2024-03-16 10:13:48 -04:00
uv-build Run interpreter discovery under `-I` mode (#2552) 2024-03-19 20:19:46 -04:00
uv-cache Remove unused dependencies (#2543) 2024-03-19 13:10:10 -04:00
uv-client Remove unused dependencies (#2543) 2024-03-19 13:10:10 -04:00
uv-dev Remove unused dependencies (#2543) 2024-03-19 13:10:10 -04:00
uv-dispatch Remove unused dependencies (#2543) 2024-03-19 13:10:10 -04:00
uv-distribution Introduce a `BaseClient` for construction of canonical configured client (#2431) 2024-03-15 12:07:38 -05:00
uv-extract Remove unused dependencies (#2543) 2024-03-19 13:10:10 -04:00
uv-fs Run interpreter discovery under `-I` mode (#2552) 2024-03-19 20:19:46 -04:00
uv-git Remove unused dependencies (#2543) 2024-03-19 13:10:10 -04:00
uv-installer Remove unused dependencies (#2543) 2024-03-19 13:10:10 -04:00
uv-interpreter Run interpreter discovery under `-I` mode (#2552) 2024-03-19 20:19:46 -04:00
uv-normalize Clippy pedantic (#1963) 2024-02-25 14:04:05 -05:00
uv-resolver Implement `--no-strip-extras` to preserve extras in compilation (#2555) 2024-03-19 23:59:32 +00:00
uv-traits Remove unused dependencies (#2543) 2024-03-19 13:10:10 -04:00
uv-trampoline Win Trampoline: Use Python executable path encoded in binary (#1803) 2024-02-22 16:10:02 +01:00
uv-version Bump version to v0.1.21 (#2517) 2024-03-18 13:51:06 -04:00
uv-virtualenv Remove unused activate script (#2556) 2024-03-19 23:50:12 +00:00
uv-warnings Rename to `uv` (#1302) 2024-02-15 11:19:46 -06:00
README.md Rename `gourgeist` to `uv-virtualenv` (#2118) 2024-03-01 14:02:40 -05:00

README.md

Crates

bench

Functionality for benchmarking uv.

cache-key

Generic functionality for caching paths, URLs, and other resources across platforms.

distribution-filename

Parse built distribution (wheel) and source distribution (sdist) filenames to extract structured metadata.

distribution-types

Abstractions for representing built distributions (wheels) and source distributions (sdists), and the sources from which they can be downloaded.

install-wheel-rs

Install built distributions (wheels) into a virtual environment.]

once-map

A waitmap-like concurrent hash map for executing tasks exactly once.

pep440-rs

Utilities for interacting with Python version numbers and specifiers.

pep508-rs

Utilities for interacting with PEP 508 dependency specifiers.

platform-host

Functionality for detecting the current platform (operating system, architecture, etc.).

platform-tags

Functionality for parsing and inferring Python platform tags as per PEP 425.

uv

Command-line interface for the uv package manager.

uv-build

A PEP 517-compatible build frontend for uv.

uv-cache

Functionality for caching Python packages and associated metadata.

uv-client

Client for interacting with PyPI-compatible HTTP APIs.

uv-dev

Development utilities for uv.

uv-dispatch

A centralized struct for resolving and building source distributions in isolated environments. Implements the traits defined in uv-traits.

uv-distribution

Client for interacting with built distributions (wheels) and source distributions (sdists). Capable of fetching metadata, distribution contents, etc.

uv-extract

Utilities for extracting files from archives.

uv-fs

Utilities for interacting with the filesystem.

uv-git

Functionality for interacting with Git repositories.

uv-installer

Functionality for installing Python packages into a virtual environment.

uv-interpreter

Functionality for detecting and leveraging the current Python interpreter.

uv-normalize

Normalize package and extra names as per Python specifications.

uv-package

Types and functionality for working with Python packages, e.g., parsing wheel files.

uv-resolver

Functionality for resolving Python packages and their dependencies.

uv-traits

Shared traits for uv, to avoid circular dependencies.

pypi-types

General-purpose type definitions for types used in PyPI-compatible APIs.

uv-virtualenv

A venv replacement to create virtual environments in Rust.

uv-warnings

User-facing warnings for uv.

requirements-txt

Functionality for parsing requirements.txt files.