Package: python3-setuptools Version: 58.2.0-1 Severity: normal X-Debbugs-CC: debian-python@lists.debian.org
Since setuptools 60+ is out with SETUPTOOLS_USE_DISTUTILS defaulting to "local", pip install --editable in --system-site-packages venvs fails: $ docker run --rm -it debian:sid # apt update # apt install git python3-setuptools python3-pip python3-venv # cd /tmp # git clone https://github.com/platformdirs/platformdirs # cd platformdirs # python3 -m venv --system-site-packages --without-pip .venv # .venv/bin/python -m pip install -e . Obtaining file:///tmp/platformdirs Installing build dependencies ... done Getting requirements to build wheel ... done Preparing wheel metadata ... done Installing collected packages: platformdirs Running setup.py develop for platformdirs ERROR: Command errored out with exit status 1: command: /tmp/platformdirs/.venv/bin/python -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/platformdirs/setup.py'"'"'; __file__='"'"'/tmp/platformdirs/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' develop --no-deps cwd: /tmp/platformdirs/ Complete output (30 lines): running develop Traceback (most recent call last): File "<string>", line 1, in <module> File "/tmp/platformdirs/setup.py", line 5, in <module> setup() File "/usr/lib/python3/dist-packages/setuptools/__init__.py", line 153, in setup return distutils.core.setup(**attrs) File "/usr/lib/python3/dist-packages/setuptools/_distutils/core.py", line 148, in setup dist.run_commands() File "/usr/lib/python3/dist-packages/setuptools/_distutils/dist.py", line 967, in run_commands self.run_command(cmd) File "/usr/lib/python3/dist-packages/setuptools/_distutils/dist.py", line 985, in run_command cmd_obj.ensure_finalized() File "/usr/lib/python3/dist-packages/setuptools/_distutils/cmd.py", line 107, in ensure_finalized self.finalize_options() File "/usr/lib/python3/dist-packages/setuptools/command/develop.py", line 52, in finalize_options easy_install.finalize_options(self) File "/usr/lib/python3/dist-packages/setuptools/command/easy_install.py", line 293, in finalize_options self.set_undefined_options( File "/usr/lib/python3/dist-packages/setuptools/_distutils/cmd.py", line 287, in set_undefined_options src_cmd_obj.ensure_finalized() File "/usr/lib/python3/dist-packages/setuptools/_distutils/cmd.py", line 107, in ensure_finalized self.finalize_options() File "/usr/lib/python3/dist-packages/setuptools/command/install_lib.py", line 17, in finalize_options self.set_undefined_options('install',('install_layout','install_layout')) File "/usr/lib/python3/dist-packages/setuptools/_distutils/cmd.py", line 290, in set_undefined_options setattr(self, dst_option, getattr(src_cmd_obj, src_option)) File "/usr/lib/python3/dist-packages/setuptools/_distutils/cmd.py", line 103, in __getattr__ raise AttributeError(attr) AttributeError: install_layout ---------------------------------------- ERROR: Command errored out with exit status 1: /tmp/platformdirs/.venv/bin/python -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/platformdirs/setup.py'"'"'; __file__='"'"'/tmp/platformdirs/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' develop --no-deps Check the logs for full command output. This happens even though setuptools 60 isn't in Debian yet, because pip downloads latest setuptools for pep517 installs that require setuptools in the build-system section of pyproject.yaml, but then fails to actually use that version fully (this is a bug in pip: https://github.com/pypa/pip/issues/6264). I'll explain what's going on in detail further down, but first I'll present a simpler reproducer that illustrates why this might be a bug in Debian's setuptools packaging as well: $ docker run --rm -it debian:sid # apt update # apt install git python3-setuptools python3-pip # cd /tmp # git clone https://github.com/platformdirs/platformdirs # cd platformdirs # SETUPTOOLS_USE_DISTUTILS=local python3 setup.py install running install Traceback (most recent call last): … File "/usr/lib/python3/dist-packages/setuptools/_distutils/cmd.py", line 103, in __getattr__ raise AttributeError(attr) AttributeError: install_layout Here we are explicitly using Debian's setuptools package, just telling it to use the embedded distutils instead of the one in stdlib. Turns out the distutils install-layout patch [1] is only applied to stdlib but not to this embedded distutils, triggering the issue. The setuptools install-layout patch [2] omits the distutils bits. [1]: https://sources.debian.org/src/python3.10/3.10.1-2/debian/patches/distutils-install-layout.diff/ [2]: https://sources.debian.org/src/setuptools/59.6.0-1/debian/patches/install-layout.diff/ I believe that patching the setuptools copy of distutils as well should fix this issue, and might be a solution for Debian 11 (which is affected as well). Going forward (setuptools 60+), the install-layout patches will need to be adapted anyway (see https://github.com/pypa/distutils/issues/2 and https://github.com/pypa/setuptools/issues/2956), so this is a temporary measure. ... Now for the gory details of why this exception occurs: PEP 517 recommends that build frontends create an isolated environment with only the build-deps declared in pyproject.toml, and pip indeed attempts to do so. It creates /tmp/pip-build-env-XXX and installs the newest setuptools, setuptools_scm, wheel, … in there. It then sets up /tmp/pip-build-env-XXX/site/sitecustomize.py to drop system paths from sys.path and points PYTHONPATH to /tmp/pip-build-env-XXX/site. Unfortunately due to https://github.com/pypa/pip/issues/6264, this doesn't work well with --system-site-packages venvs and leaves system paths visible, but /tmp/pip-build-env-XXX/overlay/lib/python3.9/site-packages/distutils-precedence.pth is still evaluated, causing the distutils bundled in setuptools to be used instead of stdlib. But these don't have the install-layout patch, so it fails. Ideally https://github.com/pypa/pip/issues/6264 would be fixed and then Debian's patching of distutils/setuptools shouldn't affect this any more, but until that happens (and it's been open for almost 3 years) … ... Oh and if anyone else stumbles upon this, a temporary workaround is to force SETUPTOOLS_USE_DISTUTILS=stdlib. -- System Information: Debian Release: bookworm/sid APT prefers stable-security APT policy: (990, 'stable-security'), (990, 'testing'), (500, 'unstable-debug'), (500, 'testing-debug'), (500, 'stable-debug'), (500, 'unstable'), (500, 'stable'), (1, 'experimental-debug'), (1, 'experimental') Architecture: amd64 (x86_64) Foreign Architectures: i386 Kernel: Linux 5.15.0-2-amd64 (SMP w/4 CPU threads) Kernel taint flags: TAINT_CPU_OUT_OF_SPEC, TAINT_USER Locale: LANG=cs_CZ.UTF-8, LC_CTYPE=cs_CZ.UTF-8 (charmap=UTF-8), LANGUAGE not set Shell: /bin/sh linked to /usr/bin/dash Init: systemd (via /run/systemd/system) LSM: AppArmor: enabled Versions of packages python3-setuptools depends on: ii python3 3.9.7-1 ii python3-distutils 3.9.9-3 ii python3-pkg-resources 58.2.0-1 python3-setuptools recommends no packages. Versions of packages python3-setuptools suggests: pn python-setuptools-doc <none> -- no debconf information -- Tomáš "liskin" ("Pivník") Janoušek, https://lisk.in/