Skip to content

ModuleNotFoundError: No module named 'wheel.cli' #3293

Description

@C0rn3j

Looks like p4a is using a privated wheels.cli module which was part of pypa/wheel#655

Traceback (most recent call last):
  File "<frozen runpy>", line 198, in _run_module_as_main
  File "<frozen runpy>", line 88, in _run_code
  File "/home/user/Projects/Tauon/.buildozer/android/platform/python-for-android/pythonforandroid/toolchain.py", line 1246, in <module>
    main()
    ~~~~^^
  File "/home/user/Projects/Tauon/.buildozer/android/platform/python-for-android/pythonforandroid/entrypoints.py", line 18, in main
    ToolchainCL()
    ~~~~~~~~~~~^^
  File "/home/user/Projects/Tauon/.buildozer/android/platform/python-for-android/pythonforandroid/toolchain.py", line 677, in __init__
    getattr(self, command)(args)
    ~~~~~~~~~~~~~~~~~~~~~~^^^^^^
  File "/home/user/Projects/Tauon/.buildozer/android/platform/python-for-android/pythonforandroid/toolchain.py", line 104, in wrapper_func
    build_dist_from_args(ctx, dist, args)
    ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
  File "/home/user/Projects/Tauon/.buildozer/android/platform/python-for-android/pythonforandroid/toolchain.py", line 163, in build_dist_from_args
    build_recipes(build_order, python_modules, ctx,
    ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                  getattr(args, "private", None),
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    ...<2 lines>...
                  ),
                  ^^
                 )
                 ^
  File "/home/user/Projects/Tauon/.buildozer/android/platform/python-for-android/pythonforandroid/build.py", line 517, in build_recipes
    recipe.build_arch(arch)
    ~~~~~~~~~~~~~~~~~^^^^^^
  File "/home/user/Projects/Tauon/.buildozer/android/platform/python-for-android/pythonforandroid/recipe.py", line 1340, in build_arch
    self.install_wheel(arch, built_wheels)
    ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/home/user/Projects/Tauon/.buildozer/android/platform/python-for-android/pythonforandroid/recipe.py", line 1283, in install_wheel
    from wheel.cli.tags import tags as wheel_tags
ModuleNotFoundError: No module named 'wheel.cli'

EDIT: Worked around with an LLM:

    def _retag_wheel_platform(self, path, new_platform_tag, remove_old=True):
        """
        Rename a wheel by replacing only its platform tag.

        Wheel filename format:
          {dist}-{version}(-{build})?-{python tag}-{abi tag}-{platform tag}.whl

        We split from the right so project names/build tags containing '-' still work.
        """
        p = Path(path)
        if p.suffix != ".whl":
            raise ValueError(f"Not a wheel: {path}")

        parts = p.stem.rsplit("-", 3)
        if len(parts) != 4:
            raise ValueError(f"Unexpected wheel filename format: {p.name}")

        left, py_tag, abi_tag, _old_platform_tag = parts
        new_name = f"{left}-{py_tag}-{abi_tag}-{new_platform_tag}.whl"
        new_path = p.with_name(new_name)

        if new_path != p:
            p.rename(new_path)
            if not remove_old and new_path != p:
                # rename already removed old path, so if you truly want both,
                # copy instead of rename
                pass

        return str(new_path)

    def install_wheel(self, arch, built_wheels):
        with patch_wheel_setuptools_logging():
            from wheel.wheelfile import WheelFile

        _wheel = built_wheels[0]
        built_wheel_dir = dirname(_wheel)

        selected_wheel = self._retag_wheel_platform(
            _wheel,
            self.get_wheel_platform_tag(arch),
            remove_old=True,
        )

        _dev_wheel_dir = environ.get("P4A_WHEEL_DIR", False)
        if _dev_wheel_dir:
            ensure_dir(_dev_wheel_dir)
            shprint(sh.cp, selected_wheel, _dev_wheel_dir)

        info(f"Installing built wheel: {basename(selected_wheel)}")
        destination = self.ctx.get_python_install_dir(arch.arch)
        with WheelFile(selected_wheel) as wf:
            for zinfo in wf.filelist:
                wf.extract(zinfo, destination)

Activity

  1. T-Dynamos commented on Mar 15, 2026

    @T-Dynamos
    Member

    Please ensure you have wheel version 0.43.0. (as listed in setup.py)

  2. C0rn3j commented on Mar 15, 2026

    @C0rn3j
    ContributorAuthor

    What's the point of closing the issue?

    The problem is still there, even if you use frozen library for now, and needs resolution.

  3. added
    Priority: LowThis issue can probably be picked up by anyone looking to contribute to the project, as an entry fix
    on Apr 18, 2026
  4. AndreMiras commented on Oct 9, 2026

    @AndreMiras
    Member

    Thanks for the report.
    It's also not clear to me how that happened 🤔 like @T-Dynamos said the wheel dependency is defined in setup.py: https://github.com/kivy/python-for-android/blob/release-2026.05.09/setup.py#L25
    Using the same Python interpreter that runs p4a, Could you run the command below and share the output?

    python -c "import sys, wheel; print(sys.executable, wheel.__version__, wheel.__file__)"

    How did you install p4a, and which Buildozer version are you using? That should help us understand why a different wheel version was loaded.

    Edit: OK I see yes the module/method is no longer exposed in recent version (since pypa/wheel#655) as you shared in the description

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Priority: LowThis issue can probably be picked up by anyone looking to contribute to the project, as an entry fixeasy

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions