diff --git a/monai/__init__.py b/monai/__init__.py index 2d6f5dfc37..db13712b35 100644 --- a/monai/__init__.py +++ b/monai/__init__.py @@ -86,6 +86,7 @@ def filter(self, record): # *.so files and folder "_C" may not exist when the cpp extensions are not compiled excludes = "|".join( [ + "(.*(nvimgcodec_pydicom_plugin)$)", "(^(monai.handlers))", "(^(monai.bundle))", "(^(monai.fl))", diff --git a/tests/data/test_init_reader.py b/tests/data/test_init_reader.py index 4cd9ac42c4..240816d7df 100644 --- a/tests/data/test_init_reader.py +++ b/tests/data/test_init_reader.py @@ -12,8 +12,11 @@ from __future__ import annotations import os +import subprocess +import sys import tempfile import unittest +from importlib.machinery import PathFinder import numpy as np @@ -65,6 +68,23 @@ def test_load_image(self): inst = LoadImaged("image", reader="NvImgCodecPydicomReader") self.assertIsInstance(inst, LoadImaged) + def test_nvimgcodec_not_imported_on_monai_import(self): + """Verify importing MONAI does not eagerly load the optional NVIDIA package.""" + nvidia_spec = PathFinder.find_spec("nvidia") + if nvidia_spec is None or nvidia_spec.submodule_search_locations is None: + self.skipTest("nvidia.nvimgcodec is not installed") + + nvimgcodec_spec = PathFinder.find_spec("nvimgcodec", nvidia_spec.submodule_search_locations) + if nvimgcodec_spec is None: + self.skipTest("nvidia.nvimgcodec is not installed") + + code = "import monai, sys; print('nvidia.nvimgcodec' in sys.modules)" + result = subprocess.run([sys.executable, "-c", code], capture_output=True, text=True) + + self.assertEqual(result.returncode, 0, result.stderr) + self.assertEqual(result.stdout.strip(), "False") + self.assertEqual(result.stderr, "") + @SkipIfNoModule("nibabel") @SkipIfNoModule("cupy") @SkipIfNoModule("kvikio")