pyqt6

Installing pyqt6-tools fails with a MemoryError


I was able to install pyqt6, but installing pyqt6-tools fails with a MemoryError. One thing to note, memory usage for Python spikes up to 3GB. Here is the output of running pip install pyqt6-tools:

Collecting pyqt6-tools
  Using cached pyqt6_tools-6.4.2.3.3-py3-none-any.whl.metadata (8.3 kB)
Collecting click (from pyqt6-tools)
  Using cached click-8.2.1-py3-none-any.whl.metadata (2.5 kB)
Collecting pyqt6==6.4.2 (from pyqt6-tools)
  Using cached PyQt6-6.4.2-cp37-abi3-win_amd64.whl.metadata (2.2 kB)
INFO: pip is looking at multiple versions of pyqt6-tools to determine which version is compatible with other requirements. This could take a while.
Collecting pyqt6-tools
  Using cached pyqt6_tools-6.3.1.3.3-py3-none-any.whl.metadata (8.3 kB)
Collecting pyqt6==6.3.1 (from pyqt6-tools)
  Using cached PyQt6-6.3.1-cp37-abi3-win_amd64.whl.metadata (2.2 kB)
Collecting pyqt6-tools
  Using cached pyqt6_tools-6.1.0.3.2-py3-none-any.whl.metadata (8.3 kB)
Collecting pyqt6==6.1.0 (from pyqt6-tools)
  Using cached PyQt6-6.1.0.tar.gz (946 kB)
  Installing build dependencies ... done
  Getting requirements to build wheel ... done
  Preparing metadata (pyproject.toml) ... error
ERROR: Exception:
Traceback (most recent call last):
  File "C:\Program Files\Python313\Lib\site-packages\pip\_internal\cli\base_command.py", line 105, in _run_wrapper
    status = _inner_run()
  File "C:\Program Files\Python313\Lib\site-packages\pip\_internal\cli\base_command.py", line 96, in _inner_run
    return self.run(options, args)
           ~~~~~~~~^^^^^^^^^^^^^^^
  File "C:\Program Files\Python313\Lib\site-packages\pip\_internal\cli\req_command.py", line 68, in wrapper
    return func(self, options, args)
  File "C:\Program Files\Python313\Lib\site-packages\pip\_internal\commands\install.py", line 387, in run
    requirement_set = resolver.resolve(
        reqs, check_supported_wheels=not options.target_dir
    )
  File "C:\Program Files\Python313\Lib\site-packages\pip\_internal\resolution\resolvelib\resolver.py", line 96, in resolve
    result = self._result = resolver.resolve(
                            ~~~~~~~~~~~~~~~~^
        collected.requirements, max_rounds=limit_how_complex_resolution_can_be
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "C:\Program Files\Python313\Lib\site-packages\pip\_vendor\resolvelib\resolvers\resolution.py", line 515, in resolve
    state = resolution.resolve(requirements, max_rounds=max_rounds)
  File "C:\Program Files\Python313\Lib\site-packages\pip\_vendor\resolvelib\resolvers\resolution.py", line 444, in resolve
    failure_criterion = self._attempt_to_pin_criterion(name)
  File "C:\Program Files\Python313\Lib\site-packages\pip\_vendor\resolvelib\resolvers\resolution.py", line 211, in _attempt_to_pin_criterion
    criteria = self._get_updated_criteria(candidate)
  File "C:\Program Files\Python313\Lib\site-packages\pip\_vendor\resolvelib\resolvers\resolution.py", line 202, in _get_updated_criteria
    self._add_to_criteria(criteria, requirement, parent=candidate)
    ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Program Files\Python313\Lib\site-packages\pip\_vendor\resolvelib\resolvers\resolution.py", line 141, in _add_to_criteria
    if not criterion.candidates:
           ^^^^^^^^^^^^^^^^^^^^
  File "C:\Program Files\Python313\Lib\site-packages\pip\_vendor\resolvelib\structs.py", line 194, in __bool__
    return bool(self._sequence)
  File "C:\Program Files\Python313\Lib\site-packages\pip\_internal\resolution\resolvelib\found_candidates.py", line 163, in __bool__
    self._bool = any(self)
                 ~~~^^^^^^
  File "C:\Program Files\Python313\Lib\site-packages\pip\_internal\resolution\resolvelib\found_candidates.py", line 147, in <genexpr>
    return (c for c in iterator if id(c) not in self._incompatible_ids)
                       ^^^^^^^^
  File "C:\Program Files\Python313\Lib\site-packages\pip\_internal\resolution\resolvelib\found_candidates.py", line 37, in _iter_built
    candidate = func()
  File "C:\Program Files\Python313\Lib\site-packages\pip\_internal\resolution\resolvelib\factory.py", line 187, in _make_candidate_from_link
    base: Optional[BaseCandidate] = self._make_base_candidate_from_link(
                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
        link, template, name, version
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "C:\Program Files\Python313\Lib\site-packages\pip\_internal\resolution\resolvelib\factory.py", line 233, in _make_base_candidate_from_link
    self._link_candidate_cache[link] = LinkCandidate(
                                       ~~~~~~~~~~~~~^
        link,
        ^^^^^
    ...<3 lines>...
        version=version,
        ^^^^^^^^^^^^^^^^
    )
    ^
  File "C:\Program Files\Python313\Lib\site-packages\pip\_internal\resolution\resolvelib\candidates.py", line 306, in __init__
    super().__init__(
    ~~~~~~~~~~~~~~~~^
        link=link,
        ^^^^^^^^^^
    ...<4 lines>...
        version=version,
        ^^^^^^^^^^^^^^^^
    )
    ^
  File "C:\Program Files\Python313\Lib\site-packages\pip\_internal\resolution\resolvelib\candidates.py", line 159, in __init__
    self.dist = self._prepare()
                ~~~~~~~~~~~~~^^
  File "C:\Program Files\Python313\Lib\site-packages\pip\_internal\resolution\resolvelib\candidates.py", line 236, in _prepare
    dist = self._prepare_distribution()
  File "C:\Program Files\Python313\Lib\site-packages\pip\_internal\resolution\resolvelib\candidates.py", line 317, in _prepare_distribution
    return preparer.prepare_linked_requirement(self._ireq, parallel_builds=True)
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Program Files\Python313\Lib\site-packages\pip\_internal\operations\prepare.py", line 532, in prepare_linked_requirement
    return self._prepare_linked_requirement(req, parallel_builds)
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Program Files\Python313\Lib\site-packages\pip\_internal\operations\prepare.py", line 647, in _prepare_linked_requirement
    dist = _get_prepared_distribution(
        req,
    ...<3 lines>...
        self.check_build_deps,
    )
  File "C:\Program Files\Python313\Lib\site-packages\pip\_internal\operations\prepare.py", line 71, in _get_prepared_distribution
    abstract_dist.prepare_distribution_metadata(
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
        finder, build_isolation, check_build_deps
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "C:\Program Files\Python313\Lib\site-packages\pip\_internal\distributions\sdist.py", line 69, in prepare_distribution_metadata
    self.req.prepare_metadata()
    ~~~~~~~~~~~~~~~~~~~~~~~~~^^
  File "C:\Program Files\Python313\Lib\site-packages\pip\_internal\req\req_install.py", line 575, in prepare_metadata
    self.metadata_directory = generate_metadata(
                              ~~~~~~~~~~~~~~~~~^
        build_env=self.build_env,
        ^^^^^^^^^^^^^^^^^^^^^^^^^
        backend=self.pep517_backend,
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        details=details,
        ^^^^^^^^^^^^^^^^
    )
    ^
  File "C:\Program Files\Python313\Lib\site-packages\pip\_internal\operations\build\metadata.py", line 34, in generate_metadata
    distinfo_dir = backend.prepare_metadata_for_build_wheel(metadata_dir)
  File "C:\Program Files\Python313\Lib\site-packages\pip\_internal\utils\misc.py", line 723, in prepare_metadata_for_build_wheel
    return super().prepare_metadata_for_build_wheel(
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
        metadata_directory=metadata_directory,
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        config_settings=cs,
        ^^^^^^^^^^^^^^^^^^^
        _allow_fallback=_allow_fallback,
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "C:\Program Files\Python313\Lib\site-packages\pip\_vendor\pyproject_hooks\_impl.py", line 224, in prepare_metadata_for_build_wheel
    return self._call_hook(
           ~~~~~~~~~~~~~~~^
        "prepare_metadata_for_build_wheel",
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    ...<4 lines>...
        },
        ^^
    )
    ^
  File "C:\Program Files\Python313\Lib\site-packages\pip\_vendor\pyproject_hooks\_impl.py", line 392, in _call_hook
    self._subprocess_runner(
    ~~~~~~~~~~~~~~~~~~~~~~~^
        [python, abspath(str(script)), hook_name, td],
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        cwd=self.source_dir,
        ^^^^^^^^^^^^^^^^^^^^
        extra_environ=extra_environ,
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "C:\Program Files\Python313\Lib\site-packages\pip\_internal\utils\subprocess.py", line 237, in runner
    call_subprocess(
    ~~~~~~~~~~~~~~~^
        cmd,
        ^^^^
    ...<3 lines>...
        spinner=spinner,
        ^^^^^^^^^^^^^^^^
    )
    ^
  File "C:\Program Files\Python313\Lib\site-packages\pip\_internal\utils\subprocess.py", line 151, in call_subprocess
    line: str = proc.stdout.readline()
                ~~~~~~~~~~~~~~~~~~~~^^
MemoryError

I have only 8GB of RAM so maybe this is not enough? I am on Qt version 6.9


Solution

  • pyqt6-tools depends on pyqt6-plugins, pyqt6-plugins was last released in 2023, python313 was not around in 2023, so pypi has no pyqt6-plugins wheels for python313 (only for python311), so pip downloads source of said plugins and tries to compile it, and pyqt6 as well (I guess you cannot compile plugins without compiling the whole qt). And that requires a lot of time and memory.

    What you can do instead:

    1. install qt tools from https://qt.io using official installer (you will need qt account for that)
    2. install python311
    3. use aqtinstall
    4. install PySide6 (or just PySide6-Essentials)

    If you only need qtcreator you can download if from github.com