From 85819578b74d3d9509b61d55273b3e55b1f806ca Mon Sep 17 00:00:00 2001 From: Ed Morley <501702+edmorley@users.noreply.github.com> Date: Sun, 7 Jul 2024 11:21:27 +0100 Subject: [PATCH] Stop installing setuptools and wheel on Python 3.12+ Currently `get-pip.py` installs not only pip, but also setuptools and wheel by default, unless the `--no-setuptools` / `--no-wheel` (or `PIP_NO_SETUPTOOLS` / `PIP_NO_WHEEL` env vars) are used. This has historically been necessary, however, modern versions of pip will now fallback to `pyproject.toml` (PEP 517: [1]) based builds (which will default to a setuptools backend, and thus automatically install setuptools and wheel in the isolated build environment) if either setuptools is not installed (as of pip 22.1: [2]), or if wheel is not installed (as of pip 23.1: [3]). In addition, as of Python 3.12, the stdlib's `ensurepip` and `venv` modules no longer install setuptools, and only install pip ([4]). As such, it is now time for `get-pip.py` to stop installing setuptools and wheel by default on Python 3.12+, in order to: - Act as another small step towards `pyproject.toml` / PEP 517 based builds eventually becoming the pip default. - Improve parity with the behaviour of `ensurepip` / `venv` on Python 3.12+. - Allow `get-pip.py` to focus on its primary responsibility: bootstrapping Pip. Closes #200. [1]: https://peps.python.org/pep-0517/ [2]: https://github.com/pypa/pip/pull/10717 [3]: https://github.com/pypa/pip/pull/11871 [4]: https://github.com/python/cpython/pull/101039 --- README.md | 26 +++++++++++++++++--------- public/3.6/get-pip.py | 13 ++++++++----- public/3.7/get-pip.py | 13 ++++++++----- public/get-pip.py | 13 ++++++++----- templates/default.py | 13 ++++++++----- 5 files changed, 49 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index 58a87c0a..af6ee292 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # get-pip.py `get-pip.py` is a bootstrapping script that enables users to install pip, -setuptools, and wheel in Python environments that don't already have them. You +in Python environments that don't already have it installed. You should not directly reference the files located in this repository and instead use the versions located at . @@ -12,26 +12,34 @@ $ curl -sSL https://bootstrap.pypa.io/get-pip.py -o get-pip.py $ python get-pip.py ``` -Upon execution, `get-pip.py` will install `pip`, `setuptools` and `wheel` in -the current Python environment. +Upon execution, `get-pip.py` will install the latest version of `pip` into the +current Python environment. When using Python 3.11 or older, by default the +packages `setuptools` and `wheel` will also be installed if an existing version +of them was not found. It is possible to provide additional arguments to the underlying script. These are passed through to the underlying `pip install` command, and can thus be -used to constraint the versions of the packages, or to pass other pip options -such as `--no-index`. +used to constrain the versions of the packages, install additional packages, +or to pass other pip options such as `--no-index`. ```console -$ python get-pip.py "pip < 21.0" "setuptools < 50.0" "wheel < 1.0" +# Constrain the Pip version +$ python get-pip.py "pip < 21.0" + +# Force the installation of `setuptools` and `wheel` on newer Python versions. +$ python get-pip.py setuptools wheel + +# Install packages from a local directory instead of PyPI. $ python get-pip.py --no-index --find-links=/local/copies ``` ### get-pip.py options -This script also has it's own options, which control which packages it will +This script also has its own options, which control which packages it will install. -- `--no-setuptools`: do not attempt to install `setuptools`. -- `--no-wheel`: do not attempt to install `wheel`. +- `--no-setuptools`: Do not attempt to install `setuptools`. This is a no-op on Python 3.12+. +- `--no-wheel`: do not attempt to install `wheel`. This is a no-op on Python 3.12+. ## Development diff --git a/public/3.6/get-pip.py b/public/3.6/get-pip.py index fd48c7fd..dd50f01e 100644 --- a/public/3.6/get-pip.py +++ b/public/3.6/get-pip.py @@ -71,11 +71,14 @@ def determine_pip_install_arguments(): args.append("pip<22.0") - if include_setuptools(pre): - args.append("setuptools") + # We no longer install setuptools and wheel by default on Python 3.12+ + # for parity with the `ensurepip` and `venv` modules. + if this_python < (3, 12): + if include_setuptools(pre): + args.append("setuptools") - if include_wheel(pre): - args.append("wheel") + if include_wheel(pre): + args.append("wheel") return ["install", "--upgrade", "--force-reinstall"] + args @@ -111,7 +114,7 @@ def bootstrap(tmpdir): monkeypatch_for_cert(tmpdir) # Execute the included pip and use it to install the latest pip and - # setuptools from PyPI + # any user-requested packages from PyPI. from pip._internal.cli.main import main as pip_entry_point args = determine_pip_install_arguments() sys.exit(pip_entry_point(args)) diff --git a/public/3.7/get-pip.py b/public/3.7/get-pip.py index 8a564342..f8e61296 100644 --- a/public/3.7/get-pip.py +++ b/public/3.7/get-pip.py @@ -71,11 +71,14 @@ def determine_pip_install_arguments(): args.append("pip<24.1") - if include_setuptools(pre): - args.append("setuptools") + # We no longer install setuptools and wheel by default on Python 3.12+ + # for parity with the `ensurepip` and `venv` modules. + if this_python < (3, 12): + if include_setuptools(pre): + args.append("setuptools") - if include_wheel(pre): - args.append("wheel") + if include_wheel(pre): + args.append("wheel") return ["install", "--upgrade", "--force-reinstall"] + args @@ -111,7 +114,7 @@ def bootstrap(tmpdir): monkeypatch_for_cert(tmpdir) # Execute the included pip and use it to install the latest pip and - # setuptools from PyPI + # any user-requested packages from PyPI. from pip._internal.cli.main import main as pip_entry_point args = determine_pip_install_arguments() sys.exit(pip_entry_point(args)) diff --git a/public/get-pip.py b/public/get-pip.py index 9ae215b9..12b6bbc2 100644 --- a/public/get-pip.py +++ b/public/get-pip.py @@ -71,11 +71,14 @@ def determine_pip_install_arguments(): args.append("pip") - if include_setuptools(pre): - args.append("setuptools") + # We no longer install setuptools and wheel by default on Python 3.12+ + # for parity with the `ensurepip` and `venv` modules. + if this_python < (3, 12): + if include_setuptools(pre): + args.append("setuptools") - if include_wheel(pre): - args.append("wheel") + if include_wheel(pre): + args.append("wheel") return ["install", "--upgrade", "--force-reinstall"] + args @@ -111,7 +114,7 @@ def bootstrap(tmpdir): monkeypatch_for_cert(tmpdir) # Execute the included pip and use it to install the latest pip and - # setuptools from PyPI + # any user-requested packages from PyPI. from pip._internal.cli.main import main as pip_entry_point args = determine_pip_install_arguments() sys.exit(pip_entry_point(args)) diff --git a/templates/default.py b/templates/default.py index 5fafca70..0e19428b 100644 --- a/templates/default.py +++ b/templates/default.py @@ -71,11 +71,14 @@ def determine_pip_install_arguments(): args.append("pip{pip_version}") - if include_setuptools(pre): - args.append("setuptools{setuptools_version}") + # We no longer install setuptools and wheel by default on Python 3.12+ + # for parity with the `ensurepip` and `venv` modules. + if this_python < (3, 12): + if include_setuptools(pre): + args.append("setuptools{setuptools_version}") - if include_wheel(pre): - args.append("wheel{wheel_version}") + if include_wheel(pre): + args.append("wheel{wheel_version}") return ["install", "--upgrade", "--force-reinstall"] + args @@ -111,7 +114,7 @@ def bootstrap(tmpdir): monkeypatch_for_cert(tmpdir) # Execute the included pip and use it to install the latest pip and - # setuptools from PyPI + # any user-requested packages from PyPI. from pip._internal.cli.main import main as pip_entry_point args = determine_pip_install_arguments() sys.exit(pip_entry_point(args))