python / python/importlib_metadata

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

Open Beginner friendly
#535 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Python
Stars
142
Forks
97
PR merge metrics
No merged PRs in 30d

Description

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 ?

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start at importlib_metadata/init.py around line 1046 and reproduce the sample wheel scenario on Windows with Python 3.10 or 3.11. Check the handling of absolute RECORD entries, then verify that Distribution.files includes the executable path as it does on Python 3.12 and later.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
tooling
Issue type
Bug
Difficulty
2/5
Estimated time
1-3 hours
Activity status
Quiet
Clarity
Clearly specified
Newbie friendliness
68/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.