Skip to content

prepare_metadata_for_build_wheel seems to be called before get_requires_for_build_wheel and causes error with bdist_wheel imports in Python 3.12.0b2 #3043

@abravalheri

Description

@abravalheri

Issue

Is there any chance prepare_metadata_for_build_wheel is being called before get_requires_for_build_wheel?1

On Python 3.12b2, the setuptools backend seems to have problem to import the bdist_wheel command implemented in the wheel package when generating the .dist_info directory:

SystemExit: error: invalid command 'bdist_wheel'

I had a quick look on the perform_packaging function in the src/tox/tox_env/python/virtual_env/package/pyproject.py, one possibility is that the call chain looks like the following (I might be wrong):

perform_packaging => _load_deps => _load_deps_from_built_metadata => get_package_dependencies => _ensure_meta_present => prepare_metadata_for_build_wheel

(before _setup_env gets the chance to run).

Environment

Provide at least:

  • OS: Debian bullseye on Docker container (python:3.12.0b2-bullseye)
Output of pip list of the host Python, where tox is installed
$ pip list
Package       Version
------------- -------
cachetools    5.3.1
chardet       5.1.0
colorama      0.4.6
distlib       0.3.6
filelock      3.12.2
packaging     23.1
pip           23.1.2
platformdirs  3.6.0
pluggy        1.1.0
pyproject-api 1.5.2
setuptools    67.8.0
tox           4.6.2
virtualenv    20.23.1
wheel         0.40.0

Output of running tox

Output of tox -rvv
$ # tox -rvv
default: 111 W remove tox env folder /tmp/myproj/.tox/default [tox/tox_env/api.py:322]
.pkg: 122 W remove tox env folder /tmp/myproj/.tox/.pkg [tox/tox_env/api.py:322]
default: 163 I find interpreter for spec PythonSpec(path=/usr/local/bin/python) [virtualenv/discovery/builtin.py:58]
default: 164 I proposed PythonInfo(spec=CPython3.12.0.beta.2-64, exe=/usr/local/bin/python, platform=linux, version='3.12.0b2 (main, Jun 13 2023, 14:30:30) [GCC 10.2.1 20210110]', encoding_fs_io=utf-8-utf-8) [virtualenv/discovery/builtin.py:65]
default: 164 D accepted PythonInfo(spec=CPython3.12.0.beta.2-64, exe=/usr/local/bin/python, platform=linux, version='3.12.0b2 (main, Jun 13 2023, 14:30:30) [GCC 10.2.1 20210110]', encoding_fs_io=utf-8-utf-8) [virtualenv/discovery/builtin.py:67]
default: 165 D filesystem is case-sensitive [virtualenv/info.py:26]
default: 184 I create virtual environment via CPython3Posix(dest=/tmp/myproj/.tox/default, clear=False, no_vcs_ignore=False, global=False) [virtualenv/run/session.py:50]
default: 184 D create folder /tmp/myproj/.tox/default/bin [virtualenv/util/path/_sync.py:12]
default: 184 D create folder /tmp/myproj/.tox/default/lib/python3.12/site-packages [virtualenv/util/path/_sync.py:12]
default: 185 D write /tmp/myproj/.tox/default/pyvenv.cfg [virtualenv/create/pyenv_cfg.py:32]
default: 185 D  home = /usr/local/bin [virtualenv/create/pyenv_cfg.py:36]
default: 185 D  implementation = CPython [virtualenv/create/pyenv_cfg.py:36]
default: 185 D  version_info = 3.12.0.beta.2 [virtualenv/create/pyenv_cfg.py:36]
default: 185 D  virtualenv = 20.23.1 [virtualenv/create/pyenv_cfg.py:36]
default: 185 D  include-system-site-packages = false [virtualenv/create/pyenv_cfg.py:36]
default: 185 D  base-prefix = /usr/local [virtualenv/create/pyenv_cfg.py:36]
default: 185 D  base-exec-prefix = /usr/local [virtualenv/create/pyenv_cfg.py:36]
default: 186 D  base-executable = /usr/local/bin/python [virtualenv/create/pyenv_cfg.py:36]
default: 186 D symlink /usr/local/bin/python to /tmp/myproj/.tox/default/bin/python [virtualenv/util/path/_sync.py:32]
default: 187 D create virtualenv import hook file /tmp/myproj/.tox/default/lib/python3.12/site-packages/_virtualenv.pth [virtualenv/create/via_global_ref/api.py:91]
default: 187 D create /tmp/myproj/.tox/default/lib/python3.12/site-packages/_virtualenv.py [virtualenv/create/via_global_ref/api.py:94]
default: 187 D ============================== target debug ============================== [virtualenv/run/session.py:52]
default: 188 D debug via /tmp/myproj/.tox/default/bin/python /usr/local/lib/python3.12/site-packages/virtualenv/create/debug.py [virtualenv/create/creator.py:200]
default: 187 D {
  "sys": {
    "executable": "/tmp/myproj/.tox/default/bin/python",
    "_base_executable": "/usr/local/bin/python3.12",
    "prefix": "/tmp/myproj/.tox/default",
    "base_prefix": "/usr/local",
    "real_prefix": null,
    "exec_prefix": "/tmp/myproj/.tox/default",
    "base_exec_prefix": "/usr/local",
    "path": [
      "/usr/local/lib/python312.zip",
      "/usr/local/lib/python3.12",
      "/usr/local/lib/python3.12/lib-dynload",
      "/tmp/myproj/.tox/default/lib/python3.12/site-packages"
    ],
    "meta_path": [
      "<class '_virtualenv._Finder'>",
      "<class '_frozen_importlib.BuiltinImporter'>",
      "<class '_frozen_importlib.FrozenImporter'>",
      "<class '_frozen_importlib_external.PathFinder'>"
    ],
    "fs_encoding": "utf-8",
    "io_encoding": "utf-8"
  },
  "version": "3.12.0b2 (main, Jun 13 2023, 14:30:30) [GCC 10.2.1 20210110]",
  "makefile_filename": "/usr/local/lib/python3.12/config-3.12-x86_64-linux-gnu/Makefile",
  "os": "<module 'os' (frozen)>",
  "site": "<module 'site' (frozen)>",
  "datetime": "<module 'datetime' from '/usr/local/lib/python3.12/datetime.py'>",
  "math": "<module 'math' from '/usr/local/lib/python3.12/lib-dynload/math.cpython-312-x86_64-linux-gnu.so'>",
  "json": "<module 'json' from '/usr/local/lib/python3.12/json/__init__.py'>"
} [virtualenv/run/session.py:53]
default: 210 I add seed packages via FromAppData(download=False, pip=bundle, via=copy, app_data_dir=/root/.local/share/virtualenv) [virtualenv/run/session.py:57]
default: 212 D install pip from wheel /usr/local/lib/python3.12/site-packages/virtualenv/seed/wheels/embed/pip-23.1.2-py3-none-any.whl via CopyPipInstall [virtualenv/seed/embed/via_app_data/via_app_data.py:49]
default: 213 D copy /root/.local/share/virtualenv/wheel/3.12/image/1/CopyPipInstall/pip-23.1.2-py3-none-any/pip-23.1.2.virtualenv to /tmp/myproj/.tox/default/lib/python3.12/site-packages/pip-23.1.2.virtualenv [virtualenv/util/path/_sync.py:40]
default: 213 D copy directory /root/.local/share/virtualenv/wheel/3.12/image/1/CopyPipInstall/pip-23.1.2-py3-none-any/pip-23.1.2.dist-info to /tmp/myproj/.tox/default/lib/python3.12/site-packages/pip-23.1.2.dist-info [virtualenv/util/path/_sync.py:40]
default: 215 D copy directory /root/.local/share/virtualenv/wheel/3.12/image/1/CopyPipInstall/pip-23.1.2-py3-none-any/pip to /tmp/myproj/.tox/default/lib/python3.12/site-packages/pip [virtualenv/util/path/_sync.py:40]
default: 258 D generated console scripts pip pip3.12 pip-3.12 pip3 [virtualenv/seed/embed/via_app_data/pip_install/base.py:43]
default: 259 I add activators for Bash, CShell, Fish, Nushell, PowerShell, Python [virtualenv/run/session.py:63]
default: 261 D write /tmp/myproj/.tox/default/pyvenv.cfg [virtualenv/create/pyenv_cfg.py:32]
default: 261 D  home = /usr/local/bin [virtualenv/create/pyenv_cfg.py:36]
default: 261 D  implementation = CPython [virtualenv/create/pyenv_cfg.py:36]
default: 261 D  version_info = 3.12.0.beta.2 [virtualenv/create/pyenv_cfg.py:36]
default: 261 D  virtualenv = 20.23.1 [virtualenv/create/pyenv_cfg.py:36]
default: 262 D  include-system-site-packages = false [virtualenv/create/pyenv_cfg.py:36]
default: 262 D  base-prefix = /usr/local [virtualenv/create/pyenv_cfg.py:36]
default: 262 D  base-exec-prefix = /usr/local [virtualenv/create/pyenv_cfg.py:36]
default: 262 D  base-executable = /usr/local/bin/python [virtualenv/create/pyenv_cfg.py:36]
.pkg: 265 I find interpreter for spec PythonSpec(path=/usr/local/bin/python) [virtualenv/discovery/builtin.py:58]
.pkg: 265 I proposed PythonInfo(spec=CPython3.12.0.beta.2-64, exe=/usr/local/bin/python, platform=linux, version='3.12.0b2 (main, Jun 13 2023, 14:30:30) [GCC 10.2.1 20210110]', encoding_fs_io=utf-8-utf-8) [virtualenv/discovery/builtin.py:65]
.pkg: 265 D accepted PythonInfo(spec=CPython3.12.0.beta.2-64, exe=/usr/local/bin/python, platform=linux, version='3.12.0b2 (main, Jun 13 2023, 14:30:30) [GCC 10.2.1 20210110]', encoding_fs_io=utf-8-utf-8) [virtualenv/discovery/builtin.py:67]
.pkg: 266 I create virtual environment via CPython3Posix(dest=/tmp/myproj/.tox/.pkg, clear=False, no_vcs_ignore=False, global=False) [virtualenv/run/session.py:50]
.pkg: 266 D create folder /tmp/myproj/.tox/.pkg/bin [virtualenv/util/path/_sync.py:12]
.pkg: 267 D create folder /tmp/myproj/.tox/.pkg/lib/python3.12/site-packages [virtualenv/util/path/_sync.py:12]
.pkg: 267 D write /tmp/myproj/.tox/.pkg/pyvenv.cfg [virtualenv/create/pyenv_cfg.py:32]
.pkg: 267 D     home = /usr/local/bin [virtualenv/create/pyenv_cfg.py:36]
.pkg: 267 D     implementation = CPython [virtualenv/create/pyenv_cfg.py:36]
.pkg: 267 D     version_info = 3.12.0.beta.2 [virtualenv/create/pyenv_cfg.py:36]
.pkg: 267 D     virtualenv = 20.23.1 [virtualenv/create/pyenv_cfg.py:36]
.pkg: 267 D     include-system-site-packages = false [virtualenv/create/pyenv_cfg.py:36]
.pkg: 267 D     base-prefix = /usr/local [virtualenv/create/pyenv_cfg.py:36]
.pkg: 267 D     base-exec-prefix = /usr/local [virtualenv/create/pyenv_cfg.py:36]
.pkg: 267 D     base-executable = /usr/local/bin/python [virtualenv/create/pyenv_cfg.py:36]
.pkg: 267 D symlink /usr/local/bin/python to /tmp/myproj/.tox/.pkg/bin/python [virtualenv/util/path/_sync.py:32]
.pkg: 268 D create virtualenv import hook file /tmp/myproj/.tox/.pkg/lib/python3.12/site-packages/_virtualenv.pth [virtualenv/create/via_global_ref/api.py:91]
.pkg: 268 D create /tmp/myproj/.tox/.pkg/lib/python3.12/site-packages/_virtualenv.py [virtualenv/create/via_global_ref/api.py:94]
.pkg: 268 D ============================== target debug ============================== [virtualenv/run/session.py:52]
.pkg: 268 D debug via /tmp/myproj/.tox/.pkg/bin/python /usr/local/lib/python3.12/site-packages/virtualenv/create/debug.py [virtualenv/create/creator.py:200]
.pkg: 268 D {
  "sys": {
    "executable": "/tmp/myproj/.tox/.pkg/bin/python",
    "_base_executable": "/usr/local/bin/python3.12",
    "prefix": "/tmp/myproj/.tox/.pkg",
    "base_prefix": "/usr/local",
    "real_prefix": null,
    "exec_prefix": "/tmp/myproj/.tox/.pkg",
    "base_exec_prefix": "/usr/local",
    "path": [
      "/usr/local/lib/python312.zip",
      "/usr/local/lib/python3.12",
      "/usr/local/lib/python3.12/lib-dynload",
      "/tmp/myproj/.tox/.pkg/lib/python3.12/site-packages"
    ],
    "meta_path": [
      "<class '_virtualenv._Finder'>",
      "<class '_frozen_importlib.BuiltinImporter'>",
      "<class '_frozen_importlib.FrozenImporter'>",
      "<class '_frozen_importlib_external.PathFinder'>"
    ],
    "fs_encoding": "utf-8",
    "io_encoding": "utf-8"
  },
  "version": "3.12.0b2 (main, Jun 13 2023, 14:30:30) [GCC 10.2.1 20210110]",
  "makefile_filename": "/usr/local/lib/python3.12/config-3.12-x86_64-linux-gnu/Makefile",
  "os": "<module 'os' (frozen)>",
  "site": "<module 'site' (frozen)>",
  "datetime": "<module 'datetime' from '/usr/local/lib/python3.12/datetime.py'>",
  "math": "<module 'math' from '/usr/local/lib/python3.12/lib-dynload/math.cpython-312-x86_64-linux-gnu.so'>",
  "json": "<module 'json' from '/usr/local/lib/python3.12/json/__init__.py'>"
} [virtualenv/run/session.py:53]
.pkg: 292 I add seed packages via FromAppData(download=False, pip=bundle, via=copy, app_data_dir=/root/.local/share/virtualenv) [virtualenv/run/session.py:57]
.pkg: 293 D install pip from wheel /usr/local/lib/python3.12/site-packages/virtualenv/seed/wheels/embed/pip-23.1.2-py3-none-any.whl via CopyPipInstall [virtualenv/seed/embed/via_app_data/via_app_data.py:49]
.pkg: 294 D copy /root/.local/share/virtualenv/wheel/3.12/image/1/CopyPipInstall/pip-23.1.2-py3-none-any/pip-23.1.2.virtualenv to /tmp/myproj/.tox/.pkg/lib/python3.12/site-packages/pip-23.1.2.virtualenv [virtualenv/util/path/_sync.py:40]
.pkg: 294 D copy directory /root/.local/share/virtualenv/wheel/3.12/image/1/CopyPipInstall/pip-23.1.2-py3-none-any/pip-23.1.2.dist-info to /tmp/myproj/.tox/.pkg/lib/python3.12/site-packages/pip-23.1.2.dist-info [virtualenv/util/path/_sync.py:40]
.pkg: 295 D copy directory /root/.local/share/virtualenv/wheel/3.12/image/1/CopyPipInstall/pip-23.1.2-py3-none-any/pip to /tmp/myproj/.tox/.pkg/lib/python3.12/site-packages/pip [virtualenv/util/path/_sync.py:40]
.pkg: 341 D generated console scripts pip-3.12 pip pip3 pip3.12 [virtualenv/seed/embed/via_app_data/pip_install/base.py:43]
.pkg: 341 I add activators for Bash, CShell, Fish, Nushell, PowerShell, Python [virtualenv/run/session.py:63]
.pkg: 343 D write /tmp/myproj/.tox/.pkg/pyvenv.cfg [virtualenv/create/pyenv_cfg.py:32]
.pkg: 343 D     home = /usr/local/bin [virtualenv/create/pyenv_cfg.py:36]
.pkg: 343 D     implementation = CPython [virtualenv/create/pyenv_cfg.py:36]
.pkg: 343 D     version_info = 3.12.0.beta.2 [virtualenv/create/pyenv_cfg.py:36]
.pkg: 343 D     virtualenv = 20.23.1 [virtualenv/create/pyenv_cfg.py:36]
.pkg: 343 D     include-system-site-packages = false [virtualenv/create/pyenv_cfg.py:36]
.pkg: 343 D     base-prefix = /usr/local [virtualenv/create/pyenv_cfg.py:36]
.pkg: 343 D     base-exec-prefix = /usr/local [virtualenv/create/pyenv_cfg.py:36]
.pkg: 343 D     base-executable = /usr/local/bin/python [virtualenv/create/pyenv_cfg.py:36]
.pkg: 344 W install_requires> python -I -m pip install setuptools [tox/tox_env/api.py:427]
Collecting setuptools
  Using cached setuptools-67.8.0-py3-none-any.whl (1.1 MB)
Installing collected packages: setuptools
Successfully installed setuptools-67.8.0
.pkg: 1949 I exit 0 (1.60 seconds) /tmp/myproj> python -I -m pip install setuptools pid=55 [tox/execute/api.py:279]
.pkg: 1951 W _optional_hooks> python /usr/local/lib/python3.12/site-packages/pyproject_api/_backend.py True setuptools.build_meta [tox/tox_env/api.py:427]
Backend: run command _optional_hooks with args {}
Backend: Wrote response {'return': {'get_requires_for_build_sdist': True, 'prepare_metadata_for_build_wheel': True, 'get_requires_for_build_wheel': True, 'build_editable': True, 'get_requires_for_build_editable': True, 'prepare_metadata_for_build_editable': True}} to /tmp/pep517__optional_hooks-q3o0s7fb.json
.pkg: 2065 I exit None (0.11 seconds) /tmp/myproj> python /usr/local/lib/python3.12/site-packages/pyproject_api/_backend.py True setuptools.build_meta pid=66 [tox/execute/api.py:279]
.pkg: 2065 W get_requires_for_build_sdist> python /usr/local/lib/python3.12/site-packages/pyproject_api/_backend.py True setuptools.build_meta [tox/tox_env/api.py:427]
Backend: run command get_requires_for_build_sdist with args {'config_settings': None}
running egg_info
writing src/myproj.egg-info/PKG-INFO
writing dependency_links to src/myproj.egg-info/dependency_links.txt
writing requirements to src/myproj.egg-info/requires.txt
writing top-level names to src/myproj.egg-info/top_level.txt
reading manifest file 'src/myproj.egg-info/SOURCES.txt'
writing manifest file 'src/myproj.egg-info/SOURCES.txt'
Backend: Wrote response {'return': []} to /tmp/pep517_get_requires_for_build_sdist-wkhpgv5y.json
.pkg: 2092 I exit None (0.03 seconds) /tmp/myproj> python /usr/local/lib/python3.12/site-packages/pyproject_api/_backend.py True setuptools.build_meta pid=66 [tox/execute/api.py:279]
.pkg: 2094 W prepare_metadata_for_build_wheel> python /usr/local/lib/python3.12/site-packages/pyproject_api/_backend.py True setuptools.build_meta [tox/tox_env/api.py:427]
Backend: run command prepare_metadata_for_build_wheel with args {'metadata_directory': '/tmp/myproj/.tox/.pkg/.meta', 'config_settings': {'--build-option': []}}
running dist_info
creating /tmp/myproj/.tox/.pkg/.meta/myproj.egg-info
writing /tmp/myproj/.tox/.pkg/.meta/myproj.egg-info/PKG-INFO
writing dependency_links to /tmp/myproj/.tox/.pkg/.meta/myproj.egg-info/dependency_links.txt
writing requirements to /tmp/myproj/.tox/.pkg/.meta/myproj.egg-info/requires.txt
writing top-level names to /tmp/myproj/.tox/.pkg/.meta/myproj.egg-info/top_level.txt
writing manifest file '/tmp/myproj/.tox/.pkg/.meta/myproj.egg-info/SOURCES.txt'
reading manifest file '/tmp/myproj/.tox/.pkg/.meta/myproj.egg-info/SOURCES.txt'
writing manifest file '/tmp/myproj/.tox/.pkg/.meta/myproj.egg-info/SOURCES.txt'
creating '/tmp/myproj/.tox/.pkg/.meta/myproj-0.42.dist-info'
Traceback (most recent call last):
  File "/tmp/myproj/.tox/.pkg/lib/python3.12/site-packages/setuptools/_distutils/core.py", line 201, in run_commands
    dist.run_commands()
  File "/tmp/myproj/.tox/.pkg/lib/python3.12/site-packages/setuptools/_distutils/dist.py", line 969, in run_commands
    self.run_command(cmd)
  File "/tmp/myproj/.tox/.pkg/lib/python3.12/site-packages/setuptools/dist.py", line 1244, in run_command
    super().run_command(command)
  File "/tmp/myproj/.tox/.pkg/lib/python3.12/site-packages/setuptools/_distutils/dist.py", line 988, in run_command
    cmd_obj.run()
  File "/tmp/myproj/.tox/.pkg/lib/python3.12/site-packages/setuptools/command/dist_info.py", line 104, in run
    bdist_wheel = self.get_finalized_command('bdist_wheel')
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/tmp/myproj/.tox/.pkg/lib/python3.12/site-packages/setuptools/_distutils/cmd.py", line 304, in get_finalized_command
    cmd_obj = self.distribution.get_command_obj(command, create)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/tmp/myproj/.tox/.pkg/lib/python3.12/site-packages/setuptools/_distutils/dist.py", line 860, in get_command_obj
    klass = self.get_command_class(command)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/tmp/myproj/.tox/.pkg/lib/python3.12/site-packages/setuptools/dist.py", line 992, in get_command_class
    return _Distribution.get_command_class(self, command)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/tmp/myproj/.tox/.pkg/lib/python3.12/site-packages/setuptools/_distutils/dist.py", line 844, in get_command_class
    raise DistutilsModuleError("invalid command '%s'" % command)
distutils.errors.DistutilsModuleError: invalid command 'bdist_wheel'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/lib/python3.12/site-packages/pyproject_api/_backend.py", line 90, in run
    outcome = backend_proxy(parsed_message["cmd"], **parsed_message["kwargs"])
Backend: Wrote response {'code': "error: invalid command 'bdist_wheel'", 'exc_type': 'SystemExit', 'exc_msg': "error: invalid command 'bdist_wheel'"} to /tmp/pep517_prepare_metadata_for_build_wheel-fo7grp6v.json
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/pyproject_api/_backend.py", line 32, in __call__
    return getattr(on_object, name)(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/tmp/myproj/.tox/.pkg/lib/python3.12/site-packages/setuptools/build_meta.py", line 380, in prepare_metadata_for_build_wheel
    self.run_setup()
  File "/tmp/myproj/.tox/.pkg/lib/python3.12/site-packages/setuptools/build_meta.py", line 338, in run_setup
    exec(code, locals())
  File "<string>", line 1, in <module>
  File "/tmp/myproj/.tox/.pkg/lib/python3.12/site-packages/setuptools/__init__.py", line 107, in setup
    return distutils.core.setup(**attrs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/tmp/myproj/.tox/.pkg/lib/python3.12/site-packages/setuptools/_distutils/core.py", line 185, in setup
    return run_commands(dist)
           ^^^^^^^^^^^^^^^^^^
  File "/tmp/myproj/.tox/.pkg/lib/python3.12/site-packages/setuptools/_distutils/core.py", line 215, in run_commands
    raise SystemExit("error: " + str(msg))
SystemExit: error: invalid command 'bdist_wheel'
.pkg: 2120 I exit None (0.03 seconds) /tmp/myproj> python /usr/local/lib/python3.12/site-packages/pyproject_api/_backend.py True setuptools.build_meta pid=66 [tox/execute/api.py:279]
default: 2121 E packaging backend failed (code=error: invalid command 'bdist_wheel'), with SystemExit: error: invalid command 'bdist_wheel'
Traceback (most recent call last):
  File "/tmp/myproj/.tox/.pkg/lib/python3.12/site-packages/setuptools/_distutils/core.py", line 201, in run_commands
    dist.run_commands()
  File "/tmp/myproj/.tox/.pkg/lib/python3.12/site-packages/setuptools/_distutils/dist.py", line 969, in run_commands
    self.run_command(cmd)
  File "/tmp/myproj/.tox/.pkg/lib/python3.12/site-packages/setuptools/dist.py", line 1244, in run_command
    super().run_command(command)
  File "/tmp/myproj/.tox/.pkg/lib/python3.12/site-packages/setuptools/_distutils/dist.py", line 988, in run_command
    cmd_obj.run()
  File "/tmp/myproj/.tox/.pkg/lib/python3.12/site-packages/setuptools/command/dist_info.py", line 104, in run
    bdist_wheel = self.get_finalized_command('bdist_wheel')
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/tmp/myproj/.tox/.pkg/lib/python3.12/site-packages/setuptools/_distutils/cmd.py", line 304, in get_finalized_command
    cmd_obj = self.distribution.get_command_obj(command, create)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/tmp/myproj/.tox/.pkg/lib/python3.12/site-packages/setuptools/_distutils/dist.py", line 860, in get_command_obj
    klass = self.get_command_class(command)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/tmp/myproj/.tox/.pkg/lib/python3.12/site-packages/setuptools/dist.py", line 992, in get_command_class
    return _Distribution.get_command_class(self, command)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/tmp/myproj/.tox/.pkg/lib/python3.12/site-packages/setuptools/_distutils/dist.py", line 844, in get_command_class
    raise DistutilsModuleError("invalid command '%s'" % command)
distutils.errors.DistutilsModuleError: invalid command 'bdist_wheel'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/lib/python3.12/site-packages/pyproject_api/_backend.py", line 90, in run
    outcome = backend_proxy(parsed_message["cmd"], **parsed_message["kwargs"])
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/pyproject_api/_backend.py", line 32, in __call__
    return getattr(on_object, name)(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/tmp/myproj/.tox/.pkg/lib/python3.12/site-packages/setuptools/build_meta.py", line 380, in prepare_metadata_for_build_wheel
    self.run_setup()
  File "/tmp/myproj/.tox/.pkg/lib/python3.12/site-packages/setuptools/build_meta.py", line 338, in run_setup
    exec(code, locals())
  File "<string>", line 1, in <module>
  File "/tmp/myproj/.tox/.pkg/lib/python3.12/site-packages/setuptools/__init__.py", line 107, in setup
    return distutils.core.setup(**attrs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/tmp/myproj/.tox/.pkg/lib/python3.12/site-packages/setuptools/_distutils/core.py", line 185, in setup
    return run_commands(dist)
           ^^^^^^^^^^^^^^^^^^
  File "/tmp/myproj/.tox/.pkg/lib/python3.12/site-packages/setuptools/_distutils/core.py", line 215, in run_commands
    raise SystemExit("error: " + str(msg))
SystemExit: error: invalid command 'bdist_wheel'
Backend: run command prepare_metadata_for_build_wheel with args {'metadata_directory': '/tmp/myproj/.tox/.pkg/.meta', 'config_settings': {'--build-option': []}}
running dist_info
creating /tmp/myproj/.tox/.pkg/.meta/myproj.egg-info
writing /tmp/myproj/.tox/.pkg/.meta/myproj.egg-info/PKG-INFO
writing dependency_links to /tmp/myproj/.tox/.pkg/.meta/myproj.egg-info/dependency_links.txt
writing requirements to /tmp/myproj/.tox/.pkg/.meta/myproj.egg-info/requires.txt
writing top-level names to /tmp/myproj/.tox/.pkg/.meta/myproj.egg-info/top_level.txt
writing manifest file '/tmp/myproj/.tox/.pkg/.meta/myproj.egg-info/SOURCES.txt'
reading manifest file '/tmp/myproj/.tox/.pkg/.meta/myproj.egg-info/SOURCES.txt'
writing manifest file '/tmp/myproj/.tox/.pkg/.meta/myproj.egg-info/SOURCES.txt'
creating '/tmp/myproj/.tox/.pkg/.meta/myproj-0.42.dist-info'
Backend: Wrote response {'code': "error: invalid command 'bdist_wheel'", 'exc_type': 'SystemExit', 'exc_msg': "error: invalid command 'bdist_wheel'"} to /tmp/pep517_prepare_metadata_for_build_wheel-fo7grp6v.json [tox/session/cmd/run/single.py:53]
.pkg: 2122 W _exit> python /usr/local/lib/python3.12/site-packages/pyproject_api/_backend.py True setuptools.build_meta [tox/tox_env/api.py:427]
Backend: run command _exit with args {}
Backend: Wrote response {'return': 0} to /tmp/pep517__exit-eqa8avq3.json
.pkg: 2132 I exit None (0.01 seconds) /tmp/myproj> python /usr/local/lib/python3.12/site-packages/pyproject_api/_backend.py True setuptools.build_meta pid=66 [tox/execute/api.py:279]
  default: FAIL code error: invalid command 'bdist_wheel' (2.03 seconds)
  evaluation failed :( (2.06 seconds)
error: invalid command 'bdist_wheel'

Minimal example

> docker run --rm -it python:3.12.0b2-bullseye /bin/bash
mkdir -p /tmp/myproj/src/myproj
cd /tmp/myproj
touch src/myproj/__init__.py
cat <<EOF > pyproject.toml
[build-system]
requires = ["setuptools"]
build-backend = "setuptools.build_meta"
EOF
cat <<EOF >setup.cfg
[metadata]
name = myproj
version = 0.42
[options.extras_require]
testing = pytest
EOF
cat <<EOF >tox.ini
[tox]
envlist = default
isolated_build = True

[testenv]
extras = testing
commands = pytest {posargs}
EOF

python -m pip install -U pip
python -m pip install -U 'tox==4.6.2'
tox
# .pkg: install_requires> python -I -m pip install setuptools
# .pkg: _optional_hooks> python /usr/local/lib/python3.12/site-packages/pyproject_api/_backend.py True setuptools.build_meta
# .pkg: get_requires_for_build_sdist> python /usr/local/lib/python3.12/site-packages/pyproject_api/_backend.py True setuptools.build_meta
# .pkg: prepare_metadata_for_build_wheel> python /usr/local/lib/python3.12/site-packages/pyproject_api/_backend.py True setuptools.build_meta
# ...
# Backend: Wrote response {'code': "error: invalid command 'bdist_wheel'", 'exc_type': 'SystemExit', 'exc_msg': "error: invalid command 'bdist_wheel'"} to /tmp/pep517_prepare_metadata_for_build_wheel-v3269hdr.json
# .pkg: _exit> python /usr/local/lib/python3.12/site-packages/pyproject_api/_backend.py True setuptools.build_meta
#   default: FAIL code error: invalid command 'bdist_wheel' (3.08 seconds)
#   evaluation failed :( (3.12 seconds)
# error: invalid command 'bdist_wheel'

Footnotes

  1. If I am not wrong PEP 517 specifies that get_requires_for_build_wheel should be called before prepare_metadata_for_build_wheel: ...get_requires_for_build_wheel ... to be installed when calling the build_wheel or prepare_metadata_for_build_wheel hooks...

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions