python / python/importlib_metadata

`Distribution.files` does not show files with absolute RECORD entries on Windows with Python 3.10 and 3.11

Abierto Apto para principiantes
#535 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Lenguaje dominante
Python
Estrellas
142
Forks
97
Métricas de merge de PR
Sin PR fusionados en 30 d

Descripción

If an installed distribution contains absolute paths in the RECORD file, Distribution.files is missing these files. (installer writes absolute paths for executable scripts on Windows since https://github.com/pypa/installer/pull/286.)

To reproduce:

Build a sample project with an executable script

project structure:

sampleproject/
├── sample/
│   ├── __init__.py
│   └── __main__.py
└── pyproject.toml

pyproject.toml:

[build-system]
requires = ["setuptools"]
build-backend = "setuptools.build_meta"

[project]
name = "sample"
version = "0.1"

[project.scripts]
sample = "sample:__main__"

build project:

python -m venv build-venv
build-venv\Scripts\python.exe -m pip install build
build-venv\Scripts\python.exe -m build sampleproject

Install the built wheel with installer and display the distribution files:

python -m venv test-venv
test-venv\Scripts\python.exe -m pip install installer importlib-metadata
test-venv\Scripts\python.exe -m installer sampleproject\dist\sample-0.1-py3-none-any.whl
test-venv\Scripts\python.exe -c "from pprint import pprint; from importlib_metadata import distribution; pprint(distribution('sample').files)"

When using Python 3.12 or later to install the wheel and display the files the correct output is:

[PackagePath('sample-0.1.dist-info/METADATA'),
PackagePath('sample-0.1.dist-info/RECORD'),
PackagePath('sample-0.1.dist-info/WHEEL'),
PackagePath('sample-0.1.dist-info/entry_points.txt'),
PackagePath('sample-0.1.dist-info/top_level.txt'),
PackagePath('C:/temp/test-uninstall/test-venv/Scripts/sample.exe'),
PackagePath('sample/__init__.py'),
PackagePath('sample/__main__.py')]

When using Python 3.11 or 3.10 to install the wheel and display the files the executable script is missing:

[PackagePath('sample-0.1.dist-info/METADATA'),
PackagePath('sample-0.1.dist-info/RECORD'),
PackagePath('sample-0.1.dist-info/WHEEL'),
PackagePath('sample-0.1.dist-info/entry_points.txt'),
PackagePath('sample-0.1.dist-info/top_level.txt'),
PackagePath('sample/__init__.py'),
PackagePath('sample/__main__.py')]

The reason is the following difference in path operations:

>C:\python311\python.exe -c "from pathlib import Path, PurePosixPath; print(Path('C:/a') / PurePosixPath('C:/b/c'))"
C:\a\b\c
 
>C:\python312\python.exe -c "from pathlib import Path, PurePosixPath; print(Path('C:/a') / PurePosixPath('C:/b/c'))"
C:\b\c

This issue can be worked around by converting the PurePosixPath to str first:

>C:\python311\python.exe -c "from pathlib import Path, PurePosixPath; print(Path('C:/a') / str(PurePosixPath('C:/b/c')))"
C:\b\c

Would you be open to such a fix in https://github.com/python/importlib_metadata/blob/f09a4bd87e3ed8f8c3bda7074bc8f7b0dfb94d72/importlib_metadata/__init__.py#L1046 ?

Guía de contribución

No hay ninguna guía de contribución indexada para este repositorio

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Línea de trabajo

Comienza en importlib_metadata/init.py alrededor de la línea 1046 y reproduce el escenario de la wheel de ejemplo en Windows con Python 3.10 o 3.11. Comprueba el manejo de las entradas RECORD absolutas y verifica después que Distribution.files incluye la ruta del ejecutable, como ocurre en Python 3.12 y posteriores.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
python
Área
tooling
Tipo de issue
Error
Dificultad
2/5
Tiempo estimado
1-3 horas
Estado de actividad
Tranquilo
Claridad
Bien especificado
Aptitud para principiantes
68/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.