Search code examples
pythondockerpippyqtpyqt5

Can't install PyQt5 using pip on alpine docker


Here is my Dockerfile:

FROM python:3.11-alpine AS app

RUN apk update && apk add make automake gcc g++ subversion python3-dev gfortran openblas-dev

RUN pip install --upgrade pip

WORKDIR /srv

When I connect to my container and I launch: pip install pyqt5

I got error:

$ pip install pyqt5
Collecting pyqt5
  Using cached PyQt5-5.15.9.tar.gz (3.2 MB)
  Installing build dependencies ... done
  Getting requirements to build wheel ... done
  Preparing metadata (pyproject.toml) ... error
  error: subprocess-exited-with-error
  
  × Preparing metadata (pyproject.toml) did not run successfully.
  │ exit code: 1
  ╰─> [25 lines of output]
      Traceback (most recent call last):
        File "/usr/local/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 353, in <module>
          main()
        File "/usr/local/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 335, in main
          json_out['return_val'] = hook(**hook_input['kwargs'])
                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "/usr/local/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 152, in prepare_metadata_for_build_wheel
          whl_basename = backend.build_wheel(metadata_directory, config_settings)
                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "/tmp/pip-build-env-z7am47sr/overlay/lib/python3.11/site-packages/sipbuild/api.py", line 46, in build_wheel
          project = AbstractProject.bootstrap('wheel',
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "/tmp/pip-build-env-z7am47sr/overlay/lib/python3.11/site-packages/sipbuild/abstract_project.py", line 87, in bootstrap
          project.setup(pyproject, tool, tool_description)
        File "/tmp/pip-build-env-z7am47sr/overlay/lib/python3.11/site-packages/sipbuild/project.py", line 586, in setup
          self.apply_user_defaults(tool)
        File "/tmp/pip-install-p2ogfk1p/pyqt5_97a9414aa7ba410f9715856d348d62b4/project.py", line 68, in apply_user_defaults
          super().apply_user_defaults(tool)
        File "/tmp/pip-build-env-z7am47sr/overlay/lib/python3.11/site-packages/pyqtbuild/project.py", line 70, in apply_user_defaults
          super().apply_user_defaults(tool)
        File "/tmp/pip-build-env-z7am47sr/overlay/lib/python3.11/site-packages/sipbuild/project.py", line 237, in apply_user_defaults
          self.builder.apply_user_defaults(tool)
        File "/tmp/pip-build-env-z7am47sr/overlay/lib/python3.11/site-packages/pyqtbuild/builder.py", line 69, in apply_user_defaults
          raise PyProjectOptionException('qmake',
      sipbuild.pyproject.PyProjectOptionException
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
error: metadata-generation-failed

× Encountered error while generating package metadata.
╰─> See above for output.

note: This is an issue with the package mentioned above, not pip.
hint: See above for details.

How to solve this ?


Solution

  • The PyQt5 Pypi project requires that qmake can be found (emphasis mine):

    pip will also build and install the bindings from the sdist package but Qt’s qmake tool must be on PATH.

    This can be done by installing e.g. qt5-qtbase-dev, potentially together with other packages. Then the qmake command can be found in the path. (If not, it can be added this way: export PATH=/usr/lib/qt5/bin:$PATH)

    So, this should work on the docker container:

    apk add qt5-qtbase-dev
    pip install --no-cache-dir pyqt5
    

    (--no-cache-dir can save memory usage. But the installation is still quite long and memory intensive.)

    Honestly, I haven't managed to install this on my computer with 32GB RAM. The installation step is quite heavy under Alpine Docker and easily leads to OOM. Sadly, there are no pre-compiled sources available (at least not in pypi): https://pypi.org/project/PyQt5/#files

    pip install PyQt5-5.15.9-cp37-abi3-manylinux_2_17_x86_64.whl
    ERROR: PyQt5-5.15.9-cp37-abi3-manylinux_2_17_x86_64.whl is not a supported wheel on this platform.
    

    If you do not find wheel files for Alpine from other locations and have not enough RAM to build yourself, I simply recommend not using Alpine Linux. Installation seems much simpler under Ubuntu and other distributions like e.g. Debian Bullseye:

    FROM python:3.11 AS app
    
    RUN apt update && apt install -y make automake gcc g++ subversion python3-dev gfortran libopenblas-dev
    
    RUN pip install --upgrade pip
    
    WORKDIR /srv
    

    Then pip install pyqt5 is no problem.


    Remark: I am not an expert for qmake. So it is possible that there are better ways instead of installation of qt5-qtbase-dev. But at least you will end having qmake available in the PATH.