-
-
Notifications
You must be signed in to change notification settings - Fork 1.4k
[BUG] Setuptools crashes when implementing find_distributions in a custom Finder in python 3.8 #3319
Copy link
Copy link
Closed
Labels
Needs TriageIssues that need to be evaluated for severity and status.Issues that need to be evaluated for severity and status.bug
Description
setuptools version
setuptools==62.2.0
Python version
3.8
OS
Ubuntu 20.04
Additional environment information
No response
Description
When implementing find_distributions on a custom Finder, setuptools crashes because it expects the returned PathDistribution instances to have attributes only present in its vendored importlib_metadata but not in python 3.8's importlib.metadata.
See https://github.com/konstin/setuptools-reproducer:
virtualenv -p 3.8 .venv
.venv/bin/pip install -r requirements.txt # pinned versions of setuptools and virtualenv
.venv/bin/python main.pyimport sys
from importlib.abc import MetaPathFinder
from importlib.machinery import PathFinder, ModuleSpec
from importlib.metadata import DistributionFinder, PathDistribution
from importlib.util import spec_from_file_location
from pathlib import Path
from typing import Iterable, Optional
class CustomFinder(PathFinder, MetaPathFinder):
"""As example, we load tqdm from a custom location"""
tqdm_folder = Path(__file__).parent.joinpath("tqdm_folder")
def find_spec(self, fullname, path=None, target=None) -> Optional[ModuleSpec]:
if fullname == "tqdm":
init_py = self.tqdm_folder.joinpath("tqdm").joinpath("__init__.py")
return spec_from_file_location(fullname, init_py)
def find_distributions(
self, context: DistributionFinder.Context = ...
) -> Iterable[PathDistribution]:
dist_info = self.tqdm_folder.joinpath("tqdm_folder").joinpath(
"tqdm-4.64.0.dist-info"
)
# Here, we return a normal python3.8 importlib.metadata.PathDistribution
return iter([PathDistribution(dist_info)])
sys.meta_path.append(CustomFinder())
# this works - we successfully made tqdm importable
# noinspection PyUnresolvedReferences
import tqdm
print(tqdm.__version__)
# this doesn't
# noinspection PyUnresolvedReferences
import virtualenv
print(virtualenv.__version__)Latest main is also affected
Expected behavior
setuptools accepts importlib.metadata.PathDistribution instances.
How to Reproduce
See https://github.com/konstin/setuptools-reproducer reproduce.sh
Output
Traceback (most recent call last):
File "main.py", line 39, in <module>
import virtualenv
File "/home/konsti/setuptools-reproducer/.venv/lib/python3.8/site-packages/virtualenv/__init__.py", line 3, in <module>
from .run import cli_run, session_via_cli
File "/home/konsti/setuptools-reproducer/.venv/lib/python3.8/site-packages/virtualenv/run/__init__.py", line 14, in <module>
from .plugin.creators import CreatorSelector
File "/home/konsti/setuptools-reproducer/.venv/lib/python3.8/site-packages/virtualenv/run/plugin/creators.py", line 6, in <module>
from virtualenv.create.via_global_ref.builtin.builtin_way import VirtualenvBuiltin
File "/home/konsti/setuptools-reproducer/.venv/lib/python3.8/site-packages/virtualenv/create/via_global_ref/builtin/builtin_way.py", line 7, in <module>
from virtualenv.create.creator import Creator
File "/home/konsti/setuptools-reproducer/.venv/lib/python3.8/site-packages/virtualenv/create/creator.py", line 15, in <module>
from virtualenv.discovery.cached_py_info import LogCmd
File "/home/konsti/setuptools-reproducer/.venv/lib/python3.8/site-packages/virtualenv/discovery/cached_py_info.py", line 23, in <module>
_CACHE[Path(sys.executable)] = PythonInfo()
File "/home/konsti/setuptools-reproducer/.venv/lib/python3.8/site-packages/virtualenv/discovery/py_info.py", line 86, in __init__
self.distutils_install = {u(k): u(v) for k, v in self._distutils_install().items()}
File "/home/konsti/setuptools-reproducer/.venv/lib/python3.8/site-packages/virtualenv/discovery/py_info.py", line 152, in _distutils_install
d = dist.Distribution({"script_args": "--no-user-cfg"}) # conf files not parsed so they do not hijack paths
File "/home/konsti/setuptools-reproducer/.venv/lib/python3.8/site-packages/setuptools/dist.py", line 470, in __init__
for ep in metadata.entry_points(group='distutils.setup_keywords'):
File "/home/konsti/setuptools-reproducer/.venv/lib/python3.8/site-packages/setuptools/_vendor/importlib_metadata/__init__.py", line 999, in entry_points
return SelectableGroups.load(eps).select(**params)
File "/home/konsti/setuptools-reproducer/.venv/lib/python3.8/site-packages/setuptools/_vendor/importlib_metadata/__init__.py", line 449, in load
ordered = sorted(eps, key=by_group)
File "/home/konsti/setuptools-reproducer/.venv/lib/python3.8/site-packages/setuptools/_vendor/importlib_metadata/__init__.py", line 996, in <genexpr>
eps = itertools.chain.from_iterable(
File "/home/konsti/setuptools-reproducer/.venv/lib/python3.8/site-packages/setuptools/_vendor/importlib_metadata/_itertools.py", line 16, in unique_everseen
k = key(element)
AttributeError: 'PathDistribution' object has no attribute '_normalized_name'Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
Needs TriageIssues that need to be evaluated for severity and status.Issues that need to be evaluated for severity and status.bug