Skip to content

monailabel cannot be installed in python 3.12 #1750

Closed
@jamesobutler

Description

@jamesobutler

Describe the bug
I run into issues running pip install monailabel using Python 3.12. I was able to successfully run pip install monai successfully though.

Currently the project specifies that it should be able to be installed on python 3.8 or newer which would include Python 3.12 (originally released October 2, 2023).

python_requires = >= 3.8

To Reproduce
Steps to reproduce the behavior:

  1. Install Python 3.12
  2. Run pip install monailabel
  3. Observe the following output:
Collecting monailabel
  Downloading monailabel-0.8.3-202405250550-py3-none-any.whl.metadata (22 kB)
Collecting bcrypt==4.1.2 (from monailabel)
  Downloading bcrypt-4.1.2-cp39-abi3-win_amd64.whl.metadata (9.8 kB)
Collecting cachetools==5.3.3 (from monailabel)
  Downloading cachetools-5.3.3-py3-none-any.whl.metadata (5.3 kB)
Collecting dicomweb-client==0.59.1 (from dicomweb-client[gcp]==0.59.1->monailabel)
  Downloading dicomweb_client-0.59.1-py3-none-any.whl.metadata (3.5 kB)
Collecting einops==0.7.0 (from monailabel)
  Downloading einops-0.7.0-py3-none-any.whl.metadata (13 kB)
Collecting expiring-dict==1.1.0 (from monailabel)
  Downloading expiring_dict-1.1.0-py3-none-any.whl.metadata (1.2 kB)
Collecting expiringdict==1.2.2 (from monailabel)
  Downloading expiringdict-1.2.2-py3-none-any.whl.metadata (3.7 kB)
Collecting fastapi==0.110.2 (from monailabel)
  Downloading fastapi-0.110.2-py3-none-any.whl.metadata (24 kB)
Collecting filelock==3.11.0 (from monailabel)
  Downloading filelock-3.11.0-py3-none-any.whl.metadata (2.5 kB)
Collecting girder-client==3.2.3 (from monailabel)
  Downloading girder-client-3.2.3.tar.gz (21 kB)
  Installing build dependencies ... done
  Getting requirements to build wheel ... done
  Installing backend dependencies ... done
  Preparing metadata (pyproject.toml) ... done
Collecting google-auth==2.29.0 (from monailabel)
  Downloading google_auth-2.29.0-py2.py3-none-any.whl.metadata (4.7 kB)
Collecting httpx==0.27.0 (from monailabel)
  Downloading httpx-0.27.0-py3-none-any.whl.metadata (7.2 kB)
Collecting monai>=1.3.1 (from monai[fire,gdown,ignite,itk,lmdb,mlflow,nibabel,openslide,pillow,psutil,skimage,tensorboard,torchvision,tqdm]>=1.3.1->monailabel)
  Downloading monai-1.3.2-py3-none-any.whl.metadata (10 kB)
Collecting ninja==1.11.1.1 (from monailabel)
  Downloading ninja-1.11.1.1-py2.py3-none-win_amd64.whl.metadata (5.4 kB)
Collecting numpymaxflow==0.0.6 (from monailabel)
  Downloading numpymaxflow-0.0.6.tar.gz (14 kB)
  Installing build dependencies ... error
  error: subprocess-exited-with-error

  × pip subprocess to install build dependencies did not run successfully.
  │ exit code: 2
  ╰─> [108 lines of output]
      Collecting setuptools
        Using cached setuptools-75.1.0-py3-none-any.whl.metadata (6.9 kB)
      Collecting numpy==1.22.0
        Downloading numpy-1.22.0.zip (11.3 MB)
           --------------------------------------- 11.3/11.3 MB 35.2 MB/s eta 0:00:00
        Installing build dependencies: started
        Installing build dependencies: finished with status 'done'
        Getting requirements to build wheel: started
        Getting requirements to build wheel: finished with status 'done'
      ERROR: Exception:
      Traceback (most recent call last):
        File "C:\Users\butlej30383\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip\_internal\cli\base_command.py", line 105, in _run_wrapper
          status = _inner_run()
                   ^^^^^^^^^^^^
        File "C:\Users\butlej30383\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip\_internal\cli\base_command.py", line 96, in _inner_run
          return self.run(options, args)
                 ^^^^^^^^^^^^^^^^^^^^^^^
        File "C:\Users\butlej30383\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip\_internal\cli\req_command.py", line 67, in wrapper
          return func(self, options, args)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^
        File "C:\Users\butlej30383\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip\_internal\commands\install.py", line 379, in run
          requirement_set = resolver.resolve(
                            ^^^^^^^^^^^^^^^^^
        File "C:\Users\butlej30383\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip\_internal\resolution\resolvelib\resolver.py", line 95, in resolve
          result = self._result = resolver.resolve(
                                  ^^^^^^^^^^^^^^^^^
        File "C:\Users\butlej30383\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip\_vendor\resolvelib\resolvers.py", line 546, in resolve
          state = resolution.resolve(requirements, max_rounds=max_rounds)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "C:\Users\butlej30383\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip\_vendor\resolvelib\resolvers.py", line 397, in resolve
          self._add_to_criteria(self.state.criteria, r, parent=None)
        File "C:\Users\butlej30383\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip\_vendor\resolvelib\resolvers.py", line 173, in _add_to_criteria
          if not criterion.candidates:
                 ^^^^^^^^^^^^^^^^^^^^
        File "C:\Users\butlej30383\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip\_vendor\resolvelib\structs.py", line 156, in __bool__
          return bool(self._sequence)
                 ^^^^^^^^^^^^^^^^^^^^
        File "C:\Users\butlej30383\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip\_internal\resolution\resolvelib\found_candidates.py", line 174, in __bool__
          return any(self)
                 ^^^^^^^^^
        File "C:\Users\butlej30383\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip\_internal\resolution\resolvelib\found_candidates.py", line 162, in <genexpr>
          return (c for c in iterator if id(c) not in self._incompatible_ids)
                             ^^^^^^^^
        File "C:\Users\butlej30383\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip\_internal\resolution\resolvelib\found_candidates.py", line 53, in _iter_built
          candidate = func()
                      ^^^^^^
        File "C:\Users\butlej30383\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip\_internal\resolution\resolvelib\factory.py", line 186, in _make_candidate_from_link
          base: Optional[BaseCandidate] = self._make_base_candidate_from_link(
                                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "C:\Users\butlej30383\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip\_internal\resolution\resolvelib\factory.py", line 232, in _make_base_candidate_from_link
          self._link_candidate_cache[link] = LinkCandidate(
                                             ^^^^^^^^^^^^^^
        File "C:\Users\butlej30383\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip\_internal\resolution\resolvelib\candidates.py", line 303, in __init__
          super().__init__(
        File "C:\Users\butlej30383\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip\_internal\resolution\resolvelib\candidates.py", line 158, in __init__
          self.dist = self._prepare()
                      ^^^^^^^^^^^^^^^
        File "C:\Users\butlej30383\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip\_internal\resolution\resolvelib\candidates.py", line 235, in _prepare
          dist = self._prepare_distribution()
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "C:\Users\butlej30383\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip\_internal\resolution\resolvelib\candidates.py", line 314, in _prepare_distribution
          return preparer.prepare_linked_requirement(self._ireq, parallel_builds=True)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "C:\Users\butlej30383\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip\_internal\operations\prepare.py", line 527, in prepare_linked_requirement
          return self._prepare_linked_requirement(req, parallel_builds)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "C:\Users\butlej30383\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip\_internal\operations\prepare.py", line 642, in _prepare_linked_requirement
          dist = _get_prepared_distribution(
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "C:\Users\butlej30383\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip\_internal\operations\prepare.py", line 72, in _get_prepared_distribution
          abstract_dist.prepare_distribution_metadata(
        File "C:\Users\butlej30383\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip\_internal\distributions\sdist.py", line 56, in prepare_distribution_metadata
          self._install_build_reqs(finder)
        File "C:\Users\butlej30383\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip\_internal\distributions\sdist.py", line 126, in _install_build_reqs
          build_reqs = self._get_build_requires_wheel()
                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "C:\Users\butlej30383\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip\_internal\distributions\sdist.py", line 103, in _get_build_requires_wheel
          return backend.get_requires_for_build_wheel()
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "C:\Users\butlej30383\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip\_internal\utils\misc.py", line 706, in get_requires_for_build_wheel
          return super().get_requires_for_build_wheel(config_settings=cs)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "C:\Users\butlej30383\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip\_vendor\pyproject_hooks\_impl.py", line 166, in get_requires_for_build_wheel
          return self._call_hook('get_requires_for_build_wheel', {
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "C:\Users\butlej30383\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip\_vendor\pyproject_hooks\_impl.py", line 321, in _call_hook
          raise BackendUnavailable(data.get('traceback', ''))
      pip._vendor.pyproject_hooks._impl.BackendUnavailable: Traceback (most recent call last):
        File "C:\Users\butlej30383\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip\_vendor\pyproject_hooks\_in_process\_in_process.py", line 77, in _build_backend
          obj = import_module(mod_path)
                ^^^^^^^^^^^^^^^^^^^^^^^
        File "C:\Users\butlej30383\AppData\Local\Programs\Python\Python312\Lib\importlib\__init__.py", line 90, in import_module
          return _bootstrap._gcd_import(name[level:], package, level)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "<frozen importlib._bootstrap>", line 1387, in _gcd_import
        File "<frozen importlib._bootstrap>", line 1360, in _find_and_load
        File "<frozen importlib._bootstrap>", line 1310, in _find_and_load_unlocked
        File "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removed
        File "<frozen importlib._bootstrap>", line 1387, in _gcd_import
        File "<frozen importlib._bootstrap>", line 1360, in _find_and_load
        File "<frozen importlib._bootstrap>", line 1331, in _find_and_load_unlocked
        File "<frozen importlib._bootstrap>", line 935, in _load_unlocked
        File "<frozen importlib._bootstrap_external>", line 995, in exec_module
        File "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removed
        File "C:\Users\butlej30383\AppData\Local\Temp\pip-build-env-jk2d6mxz\overlay\Lib\site-packages\setuptools\__init__.py", line 10, in <module>
          import distutils.core
      ModuleNotFoundError: No module named 'distutils'

      [end of output]

  note: This error originates from a subprocess, and is likely not a problem with pip.
error: subprocess-exited-with-error

× pip subprocess to install build dependencies did not run successfully.
│ exit code: 2
╰─> See above for output.

note: This error originates from a subprocess, and is likely not a problem with pip.
  1. Run pip install monai
Collecting monai
  Using cached monai-1.3.2-py3-none-any.whl.metadata (10 kB)
Collecting torch>=1.9 (from monai)
  Downloading torch-2.4.1-cp312-cp312-win_amd64.whl.metadata (27 kB)
Collecting numpy>=1.20 (from monai)
  Downloading numpy-2.1.2-cp312-cp312-win_amd64.whl.metadata (59 kB)
Collecting filelock (from torch>=1.9->monai)
  Downloading filelock-3.16.1-py3-none-any.whl.metadata (2.9 kB)
Collecting typing-extensions>=4.8.0 (from torch>=1.9->monai)
  Using cached typing_extensions-4.12.2-py3-none-any.whl.metadata (3.0 kB)
Collecting sympy (from torch>=1.9->monai)
  Using cached sympy-1.13.3-py3-none-any.whl.metadata (12 kB)
Collecting networkx (from torch>=1.9->monai)
  Using cached networkx-3.3-py3-none-any.whl.metadata (5.1 kB)
Collecting jinja2 (from torch>=1.9->monai)
  Using cached jinja2-3.1.4-py3-none-any.whl.metadata (2.6 kB)
Collecting fsspec (from torch>=1.9->monai)
  Using cached fsspec-2024.9.0-py3-none-any.whl.metadata (11 kB)
Collecting setuptools (from torch>=1.9->monai)
  Using cached setuptools-75.1.0-py3-none-any.whl.metadata (6.9 kB)
Collecting MarkupSafe>=2.0 (from jinja2->torch>=1.9->monai)
  Downloading MarkupSafe-3.0.1-cp312-cp312-win_amd64.whl.metadata (4.1 kB)
Collecting mpmath<1.4,>=1.1.0 (from sympy->torch>=1.9->monai)
  Using cached mpmath-1.3.0-py3-none-any.whl.metadata (8.6 kB)
Using cached monai-1.3.2-py3-none-any.whl (1.4 MB)
Downloading numpy-2.1.2-cp312-cp312-win_amd64.whl (12.6 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 12.6/12.6 MB 24.6 MB/s eta 0:00:00
Downloading torch-2.4.1-cp312-cp312-win_amd64.whl (199.4 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 199.4/199.4 MB 31.0 MB/s eta 0:00:00
Using cached typing_extensions-4.12.2-py3-none-any.whl (37 kB)
Downloading filelock-3.16.1-py3-none-any.whl (16 kB)
Using cached fsspec-2024.9.0-py3-none-any.whl (179 kB)
Using cached jinja2-3.1.4-py3-none-any.whl (133 kB)
Using cached networkx-3.3-py3-none-any.whl (1.7 MB)
Using cached setuptools-75.1.0-py3-none-any.whl (1.2 MB)
Using cached sympy-1.13.3-py3-none-any.whl (6.2 MB)
Downloading MarkupSafe-3.0.1-cp312-cp312-win_amd64.whl (15 kB)
Using cached mpmath-1.3.0-py3-none-any.whl (536 kB)
Installing collected packages: mpmath, typing-extensions, sympy, setuptools, numpy, networkx, MarkupSafe, fsspec, filelock, jinja2, torch, monai
  WARNING: The script isympy.exe is installed in 'C:\Users\butlej30383\AppData\Local\Programs\Python\Python312\Scripts' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
  WARNING: The scripts f2py.exe and numpy-config.exe are installed in 'C:\Users\butlej30383\AppData\Local\Programs\Python\Python312\Scripts' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
  WARNING: The scripts convert-caffe2-to-onnx.exe, convert-onnx-to-caffe2.exe and torchrun.exe are installed in 'C:\Users\butlej30383\AppData\Local\Programs\Python\Python312\Scripts' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
Successfully installed MarkupSafe-3.0.1 filelock-3.16.1 fsspec-2024.9.0 jinja2-3.1.4 monai-1.3.2 mpmath-1.3.0 networkx-3.3 numpy-2.1.2 setuptools-75.1.0 sympy-1.13.3 torch-2.4.1 typing-extensions-4.12.2

Expected behavior
monailabel should be able to install from pypi using Python 3.12.

Environment

Python 3.12.7
Windows

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