From 0e12b4825a4a1827a062b932b65fb4460f9a4288 Mon Sep 17 00:00:00 2001 From: Andres Guzman-Ballen Date: Fri, 17 Jul 2026 12:25:12 -0500 Subject: [PATCH 1/5] Add test asserting cuda.core. is not imported --- cuda_core/tests/test_duplicate_imports.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 cuda_core/tests/test_duplicate_imports.py diff --git a/cuda_core/tests/test_duplicate_imports.py b/cuda_core/tests/test_duplicate_imports.py new file mode 100644 index 00000000000..101877a0947 --- /dev/null +++ b/cuda_core/tests/test_duplicate_imports.py @@ -0,0 +1,20 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# +# SPDX-License-Identifier: Apache-2.0 + +"""Tests cuda.core.__init__.py does not import duplicate modules.""" + +import sys + +from cuda import bindings + +cuda_major = bindings.__version__.split(".")[0] + + +def test_typing_module_imports(): + """ + Importing cuda.core.system should not also import cuda.core.cuXX.system + """ + + assert "cuda.core.system" in sys.modules + assert f"cuda.core.cu{cuda_major}.system" not in sys.modules From b3717d4fc7ad97e513d6f433a6e77bf1ee047a50 Mon Sep 17 00:00:00 2001 From: Andres Guzman-Ballen Date: Thu, 23 Jul 2026 11:45:41 -0500 Subject: [PATCH 2/5] Append versioned module path to cuda.core.__path__ --- cuda_core/cuda/core/__init__.py | 17 ++++++++++------- cuda_core/tests/test_duplicate_imports.py | 4 +++- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/cuda_core/cuda/core/__init__.py b/cuda_core/cuda/core/__init__.py index dc6fefdffea..c84351855f0 100644 --- a/cuda_core/cuda/core/__init__.py +++ b/cuda_core/cuda/core/__init__.py @@ -5,8 +5,11 @@ from cuda.core._version import __version__ +# TODO: remove this function altogether after wheel-variants become mainstream def _import_versioned_module() -> None: import importlib + import pathlib + import sys from cuda import bindings @@ -15,13 +18,13 @@ def _import_versioned_module() -> None: raise ImportError("cuda.bindings 12.x or 13.x must be installed") subdir = f"cu{cuda_major}" - try: - versioned_mod = importlib.import_module(f".{subdir}", __package__) - # Import all symbols from the module - globals().update(versioned_mod.__dict__) - except ImportError: - # This is not a wheel build, but a conda or local build, do nothing - pass + versioned_path = pathlib.Path(__file__).parent / subdir + # This is a wheel build with relevant modules in cuda/core/cu + # directory. Let's add it to module path so imports work as expected. + # cuda.core.cu is not meant to behave as a module itself, and + # does not belong in sys.modules + if versioned_path.is_dir(): + __path__.append(str(versioned_path)) _import_versioned_module() diff --git a/cuda_core/tests/test_duplicate_imports.py b/cuda_core/tests/test_duplicate_imports.py index 101877a0947..91c9aa6331a 100644 --- a/cuda_core/tests/test_duplicate_imports.py +++ b/cuda_core/tests/test_duplicate_imports.py @@ -16,5 +16,7 @@ def test_typing_module_imports(): Importing cuda.core.system should not also import cuda.core.cuXX.system """ + from cuda.core import * # NOQA + assert "cuda.core.system" in sys.modules - assert f"cuda.core.cu{cuda_major}.system" not in sys.modules + assert f"cuda.core.cu{cuda_major}" not in sys.modules From 3922d6d37b92f5d747a66f0d917ac97869bd9a61 Mon Sep 17 00:00:00 2001 From: Andres Guzman-Ballen Date: Fri, 14 Aug 2026 13:45:44 -0500 Subject: [PATCH 3/5] Import cuda.core.* in test_duplicate_imports.py at module level --- cuda_core/tests/test_duplicate_imports.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cuda_core/tests/test_duplicate_imports.py b/cuda_core/tests/test_duplicate_imports.py index 91c9aa6331a..5558457f2cd 100644 --- a/cuda_core/tests/test_duplicate_imports.py +++ b/cuda_core/tests/test_duplicate_imports.py @@ -7,6 +7,7 @@ import sys from cuda import bindings +from cuda.core import * # NOQA cuda_major = bindings.__version__.split(".")[0] @@ -16,7 +17,5 @@ def test_typing_module_imports(): Importing cuda.core.system should not also import cuda.core.cuXX.system """ - from cuda.core import * # NOQA - assert "cuda.core.system" in sys.modules assert f"cuda.core.cu{cuda_major}" not in sys.modules From 557453b5d898a1e78fc0a79825181541f3005894 Mon Sep 17 00:00:00 2001 From: Andres Guzman-Ballen Date: Tue, 25 Aug 2026 13:34:27 -0500 Subject: [PATCH 4/5] Revert all changes --- cuda_core/cuda/core/__init__.py | 17 +++++++---------- cuda_core/tests/test_duplicate_imports.py | 21 --------------------- 2 files changed, 7 insertions(+), 31 deletions(-) delete mode 100644 cuda_core/tests/test_duplicate_imports.py diff --git a/cuda_core/cuda/core/__init__.py b/cuda_core/cuda/core/__init__.py index c84351855f0..dc6fefdffea 100644 --- a/cuda_core/cuda/core/__init__.py +++ b/cuda_core/cuda/core/__init__.py @@ -5,11 +5,8 @@ from cuda.core._version import __version__ -# TODO: remove this function altogether after wheel-variants become mainstream def _import_versioned_module() -> None: import importlib - import pathlib - import sys from cuda import bindings @@ -18,13 +15,13 @@ def _import_versioned_module() -> None: raise ImportError("cuda.bindings 12.x or 13.x must be installed") subdir = f"cu{cuda_major}" - versioned_path = pathlib.Path(__file__).parent / subdir - # This is a wheel build with relevant modules in cuda/core/cu - # directory. Let's add it to module path so imports work as expected. - # cuda.core.cu is not meant to behave as a module itself, and - # does not belong in sys.modules - if versioned_path.is_dir(): - __path__.append(str(versioned_path)) + try: + versioned_mod = importlib.import_module(f".{subdir}", __package__) + # Import all symbols from the module + globals().update(versioned_mod.__dict__) + except ImportError: + # This is not a wheel build, but a conda or local build, do nothing + pass _import_versioned_module() diff --git a/cuda_core/tests/test_duplicate_imports.py b/cuda_core/tests/test_duplicate_imports.py deleted file mode 100644 index 5558457f2cd..00000000000 --- a/cuda_core/tests/test_duplicate_imports.py +++ /dev/null @@ -1,21 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# -# SPDX-License-Identifier: Apache-2.0 - -"""Tests cuda.core.__init__.py does not import duplicate modules.""" - -import sys - -from cuda import bindings -from cuda.core import * # NOQA - -cuda_major = bindings.__version__.split(".")[0] - - -def test_typing_module_imports(): - """ - Importing cuda.core.system should not also import cuda.core.cuXX.system - """ - - assert "cuda.core.system" in sys.modules - assert f"cuda.core.cu{cuda_major}" not in sys.modules From 5d2520545ee6d312f358ac991fe81d21fa7e437b Mon Sep 17 00:00:00 2001 From: Andres Guzman-Ballen Date: Tue, 25 Aug 2026 13:35:33 -0500 Subject: [PATCH 5/5] Add test_duplicate_imports.py (only runs when cu<12/13> module exists) --- cuda_core/tests/test_duplicate_imports.py | 32 +++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 cuda_core/tests/test_duplicate_imports.py diff --git a/cuda_core/tests/test_duplicate_imports.py b/cuda_core/tests/test_duplicate_imports.py new file mode 100644 index 00000000000..6299c2c9788 --- /dev/null +++ b/cuda_core/tests/test_duplicate_imports.py @@ -0,0 +1,32 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# +# SPDX-License-Identifier: Apache-2.0 + +"""Tests cuda.core.__init__.py does not import duplicate modules.""" + +import sys +from importlib.metadata import distribution + +import pytest + +from cuda import bindings + +# Issue only appears when cuda/core/cu directory is present in +# site-packages; skip when 'cuda.core.cu' is not found +cuda_major = bindings.__version__.split(".")[0] +pip_submodule = f"cuda.core.{cuda_major}" +dist = distribution("cuda-core") + +if not dist.locate_file(f"cuda/core/cu{cuda_major}"): + pytest.skip(f"{pip_submodule} not present", allow_module_level=True) + + +def test_typing_module_imports(): + """ + Importing cuda.core.system should not also import cuda.core.cuXX.system + """ + import cuda.core + import cuda.core.system # NOQA + + assert "cuda.core.system" in sys.modules + assert f"cuda.core.cu{cuda_major}" not in sys.modules