The importlib_resources
backport for Python < 3.7 of the importlib.resources
standard library module has the following section in the setup.cfg file:
[options]
python_requires = >=2.7,!=3.0,!=3.1,!=3.2,!=3.3
setup_requires =
setuptools
wheel
install_requires =
pathlib2; python_version < '3'
typing; python_version < '3.5'
packages = find:
Why does setup_requires
include setuptools
? This does not seem to make sense since:
the first line of the setup.py file imports setuptools
, so by the time the setup
function is called and reads the setup.cfg file that instructs to install setuptools
it is already too late to install setuptools
:
from setuptools import setup
setup()
setuptools
is already installed on any fresh Python installation (well, only tested on Windows 10 and MacOS 10.15 with Python 3.8.0):
$ python -V
Python 3.8.0
$ pip list
Package Version
---------- -------
pip 19.2.3
setuptools 41.2.0
WARNING: You are using pip version 19.2.3, however version 19.3.1 is available.
You should consider upgrading via the 'python -m pip install --upgrade pip' command.
No, setuptools
should not be included in setup_requires
, according to PEP 518 (bold emphasis mine):
Setuptools tried to solve this with a
setup_requires
argument to itssetup()
function [3]. This solution has a number of issues, such as:
- No tooling (besides setuptools itself) can access this information without executing the
setup.py
, butsetup.py
can't be executed without having these items installed.- While setuptools itself will install anything listed in this, they won't be installed until during the execution of the
setup()
function, which means that the only way to actually use anything added here is through increasingly complex machinations that delay the import and usage of these modules until later on in the execution of thesetup()
function.- This cannot include
setuptools
itself nor can it include a replacement tosetuptools
, which means that projects such asnumpy.distutils
are largely incapable of utilizing it and projects cannot take advantage of newer setuptools features until their users naturally upgrade the version of setuptools to a newer one.- The items listed in
setup_requires
get implicitly installed whenever you execute thesetup.py
but one of the common ways that thesetup.py
is executed is via another tool, such aspip
, who is already managing dependencies. This means that a command likepip install spam
might end up having both pip and setuptools downloading and installing packages and end users needing to configure both tools (and forsetuptools
without being in control of the invocation) to change settings like which repository it installs from. It also means that users need to be aware of the discovery rules for both tools, as one may support different package formats or determine the latest version differently.
The accepted answer is mostly correct, but where PEP 518 says.
[The
setup_requires
mechanism] cannot includesetuptools
itself...
It's technically incorrect, and as importlib_resources
demonstrates, it can actually include setuptools
. The problem is that including setuptools
in setup_requires
serves mostly as documentation. It declares that setuptools
is a build requirement (required to run setup.py), but it won't be capable of satisfying that requirement if it's not already satisfied.
But, the presence of setuptools
in setup_requires
is technically correct and does serve the purpose of declaring the requirement and asking setuptools to verify that the requirement is in fact installed (alongside other setup-time requirements).
It is, however, just a legacy artifact and doesn't provide that much value, and as can be seen in the question and answers, it does lead to confusion. The recommended, proper, approach is to use PEP 517 and 518 declarations and builders, but that part of the ecosystem hasn't matured yet, so setuptools vestiges will remain. Try not to let them bother you.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With