Description
setuptools version
setuptools==62.1.0
(however the earliest affected version is setuptools==60.9.1
)
Python version
Python 3.9 (though 3.7 and 3.8 are also affected)
OS
Docker image python:3.9.12
which is Debian 11 (it also occurs on Ubuntu on Heroku)
Additional environment information
importlib-metadata==0.20
Description
Between setuptools 60.9.0 and 60.9.1, a previously working project now encounters an error during the python setup.py egg_info
phase of pip install
:
× python setup.py egg_info did not run successfully.
│ exit code: 1
╰─> [22 lines of output]
Traceback (most recent call last):
File "<string>", line 2, in <module>
File "<pip-setuptools-caller>", line 14, in <module>
File "/usr/local/lib/python3.9/site-packages/setuptools/__init__.py", line 18, in <module>
from setuptools.dist import Distribution
File "/usr/local/lib/python3.9/site-packages/setuptools/dist.py", line 35, in <module>
from ._importlib import metadata
File "/usr/local/lib/python3.9/site-packages/setuptools/_importlib.py", line 28, in <module>
disable_importlib_metadata_finder(metadata)
File "/usr/local/lib/python3.9/site-packages/setuptools/_importlib.py", line 12, in disable_importlib_metadata_finder
import importlib_metadata
File "/usr/local/lib/python3.9/site-packages/importlib_metadata/__init__.py", line 490, in <module>
__version__ = version(__name__)
File "/usr/local/lib/python3.9/site-packages/importlib_metadata/__init__.py", line 457, in version
return distribution(package).version
File "/usr/local/lib/python3.9/site-packages/importlib_metadata/__init__.py", line 430, in distribution
return Distribution.from_name(package)
File "/usr/local/lib/python3.9/site-packages/importlib_metadata/__init__.py", line 179, in from_name
dists = resolver(name)
File "/usr/local/lib/python3.9/site-packages/setuptools/_vendor/importlib_metadata/__init__.py", line 886, in find_distributions
found = self._search_paths(context.name, context.path)
AttributeError: 'str' object has no attribute 'name'
The changes between those two setuptools versions are:
v60.9.0...v60.9.1
In addition to the workaround of downgrading setuptools to 60.9.0
, I also found that making any of the following changes prevents the error from occurring:
- Upgrading Python to 3.10 (it only seems to affect <=3.9)
- Upgrading importlib-metadata from 0.20 to 0.21+ (changelog)
It looks like the two copies of importlib-metadata
(the older one in the environment, and the newer one vendored in setuptools) are inadvertently interacting.
I'm presuming the root cause of this and #3292 are similar/the same, however filing separately in case they are not (particularly given one is build-time, the other run-time etc).
Expected behavior
Either:
- The
python setup.py egg_info
phase ofpip install
succeeds with newer versions of setuptools, as it did before. - Or, setuptools outputs a warning/error to make debugging this easier, or otherwise blocks usage with incompatible
importlib-metadata
versions.
How to Reproduce
docker run --rm -it python:3.9.12 bash
mkdir -p testcase/mypackage && touch testcase/mypackage/__init__.py
echo 'from setuptools import setup; setup(name="mypackage", version="0.0.1", packages=["mypackage"])' > testcase/setup.py
pip install setuptools==62.1.0
pip install importlib-metadata==0.20
pip install ./testcase
Output
$ docker run --rm -it python:3.9.12 bash
...
root@f2eceebb1668:/# mkdir -p testcase/mypackage && touch testcase/mypackage/__init__.py
root@f2eceebb1668:/# echo 'from setuptools import setup; setup(name="mypackage", version="0.0.1", packages=["mypackage"])' > testcase/setup.py
root@f2eceebb1668:/# pip install setuptools==62.1.0
...
Successfully installed setuptools-62.1.0
root@f2eceebb1668:/# pip install importlib-metadata==0.20
...
Successfully installed importlib-metadata-0.20 zipp-3.8.0
root@f2eceebb1668:/# pip install ./testcase
Processing /testcase
Preparing metadata (setup.py) ... error
error: subprocess-exited-with-error
× python setup.py egg_info did not run successfully.
│ exit code: 1
╰─> [22 lines of output]
Traceback (most recent call last):
File "<string>", line 2, in <module>
File "<pip-setuptools-caller>", line 14, in <module>
File "/usr/local/lib/python3.9/site-packages/setuptools/__init__.py", line 18, in <module>
from setuptools.dist import Distribution
File "/usr/local/lib/python3.9/site-packages/setuptools/dist.py", line 35, in <module>
from ._importlib import metadata
File "/usr/local/lib/python3.9/site-packages/setuptools/_importlib.py", line 28, in <module>
disable_importlib_metadata_finder(metadata)
File "/usr/local/lib/python3.9/site-packages/setuptools/_importlib.py", line 12, in disable_importlib_metadata_finder
import importlib_metadata
File "/usr/local/lib/python3.9/site-packages/importlib_metadata/__init__.py", line 490, in <module>
__version__ = version(__name__)
File "/usr/local/lib/python3.9/site-packages/importlib_metadata/__init__.py", line 457, in version
return distribution(package).version
File "/usr/local/lib/python3.9/site-packages/importlib_metadata/__init__.py", line 430, in distribution
return Distribution.from_name(package)
File "/usr/local/lib/python3.9/site-packages/importlib_metadata/__init__.py", line 179, in from_name
dists = resolver(name)
File "/usr/local/lib/python3.9/site-packages/setuptools/_vendor/importlib_metadata/__init__.py", line 886, in find_distributions
found = self._search_paths(context.name, context.path)
AttributeError: 'str' object has no attribute 'name'
[end of output]
note: This error originates from a subprocess, and is likely not a problem with pip.
error: metadata-generation-failed
× Encountered error while generating package metadata.
╰─> See above for output.