diff --git a/monai/transforms/io/array.py b/monai/transforms/io/array.py index f0c1d1949d..b30a29c3c1 100644 --- a/monai/transforms/io/array.py +++ b/monai/transforms/io/array.py @@ -210,10 +210,10 @@ def __init__( the_reader = look_up_option(_r.lower(), SUPPORTED_READERS) try: self.register(the_reader(*args, **kwargs)) - except OptionalImportError: - warnings.warn( + except OptionalImportError as e: + raise OptionalImportError( f"required package for reader {_r} is not installed, or the version doesn't match requirement." - ) + ) from e except TypeError: # the reader doesn't have the corresponding args/kwargs warnings.warn(f"{_r} is not supported with the given parameters {args} {kwargs}.") self.register(the_reader()) diff --git a/tests/data/test_init_reader.py b/tests/data/test_init_reader.py index 4170412207..47421f72b0 100644 --- a/tests/data/test_init_reader.py +++ b/tests/data/test_init_reader.py @@ -15,6 +15,7 @@ from monai.data import ITKReader, NibabelReader, NrrdReader, NumpyReader, PILReader, PydicomReader from monai.transforms import LoadImage, LoadImaged +from monai.utils import OptionalImportError from tests.test_utils import SkipIfNoModule @@ -26,8 +27,13 @@ def test_load_image(self): self.assertIsInstance(instance2, LoadImage) for r in ["NibabelReader", "PILReader", "ITKReader", "NumpyReader", "NrrdReader", "PydicomReader", None]: - inst = LoadImaged("image", reader=r) - self.assertIsInstance(inst, LoadImaged) + with self.subTest(reader=r): + try: + inst = LoadImaged("image", reader=r) + self.assertIsInstance(inst, LoadImaged) + except OptionalImportError: + if r is None: + self.fail("LoadImaged(reader=None) should not raise OptionalImportError.") @SkipIfNoModule("nibabel") @SkipIfNoModule("cupy") diff --git a/tests/transforms/test_load_image.py b/tests/transforms/test_load_image.py index 031e38272e..8b0b137c43 100644 --- a/tests/transforms/test_load_image.py +++ b/tests/transforms/test_load_image.py @@ -498,5 +498,24 @@ def test_correct(self, input_param, expected_shape, track_meta): self.assertFalse(hasattr(r, "affine")) +class TestLoadImageReaderNotInstalled(unittest.TestCase): + """Tests that LoadImage raises when a user-specified reader's package is not installed.""" + + def test_raises_when_user_specified_reader_not_installed(self): + """Test LoadImage raises OptionalImportError for a missing user-specified reader. + + Raises: + OptionalImportError: when the package required by the specified reader is not installed. + """ + from unittest.mock import patch + + from monai.utils import OptionalImportError + + # Patch ITKReader.__init__ to simulate the package not being installed + with patch("monai.data.image_reader.ITKReader.__init__", side_effect=OptionalImportError("itk not installed")): + with self.assertRaisesRegex(OptionalImportError, "itk not installed|required package for reader ITKReader"): + LoadImage(reader="ITKReader") + + if __name__ == "__main__": unittest.main()