-
-
Notifications
You must be signed in to change notification settings - Fork 1.3k
Description
setuptools version
77.0.1
Python version
Tested on 3.9 and 3.13
OS
macOS
Additional environment information
No response
Description
In an environment which has a manually installed version of packaging
less than the implicit requirement in setuptools
of 24.2, import setuptools
fails while attempting to import packaging.licenses
.
setuptools
vendors packaging
at 24.2 and does not declare a separate dependency on it with no optionals specified. If the environment already has packaging<24
installed in it, pip install -U setuptools 'packaging<24.2'
(or the like) will produce what pip
considers to be a valid environment, but setuptools
will import a version of packaging
it is incompatible with.
This can have a knock-on effect causing some packages (I haven't tracked down the full set of criteria needed) to fail with an incorrect error message, such as (pyperclip==1.9.0
is the example I saw in our CI):
Collecting pyperclip>=1.8 (from cmd2>=1.0.0->cliff>=2.8.0->stestr>=3.2.0->qiskit-neko==0.0.1)
Downloading pyperclip-1.9.0.tar.gz (20 kB)
Preparing metadata (setup.py): started
Preparing metadata (setup.py): finished with status 'error'
error: subprocess-exited-with-error
× python setup.py egg_info did not run successfully.
│ exit code: 1
╰─> [1 lines of output]
ERROR: Can not execute `setup.py` since setuptools is not available in the build environment.
[end of output]
Actually, setuptools==77.0.1
is installed, it's packaging.licenses
that fails to import (since it's pulling from the out-of-date version of packaging
, not the vendored one), but the raised ModuleNotFoundError
is treated by pip
as being that setuptools
is absent.
Expected behavior
The import should succeed.
How to Reproduce
- Create a new virtual environment, seeded with
pip install -U setuptools 'packaging<24.2'
. No error is thrown during package resolution becausesetuptools
without an optional does not depend onpackaging
(due to the vendoring). - Attempt to
import setuptools
Output
>>> import setuptools
Traceback (most recent call last):
File "<python-input-0>", line 1, in <module>
import setuptools
File "/Users/jake/tmp/setuptools-repro/venv313/lib/python3.13/site-packages/setuptools/__init__.py", line 27, in <module>
from .dist import Distribution
File "/Users/jake/tmp/setuptools-repro/venv313/lib/python3.13/site-packages/setuptools/dist.py", line 15, in <module>
from packaging.licenses import canonicalize_license_expression
ModuleNotFoundError: No module named 'packaging.licenses'