From 95ab7149feca27b6dd97c3c268e32ee96ac37b09 Mon Sep 17 00:00:00 2001 From: Pavel Guzenfeld <67074795+PavelGuzenfeld@users.noreply.github.com> Date: Sun, 15 Mar 2026 23:21:42 +0200 Subject: [PATCH] Fix Python bindings when optional modules like gapi are disabled MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix two issues that cause `import cv2` to fail when building with -DBUILD_opencv_gapi=OFF: 1. In `has_all_required_modules()`, the function parameter `type_node` was ignored in favor of the enclosing scope's loop variable `node`. This works by accident when called as `has_all_required_modules(node)` but is incorrect — the parameter should be used directly. 2. In `__load_extra_py_code_for_module()`, only `ImportError` was caught. When a stale gapi submodule directory exists from a previous build, gapi/__init__.py raises `AttributeError` (not `ImportError`) because it tries to access C++ bindings that don't exist. Now catches both exception types for defense-in-depth. Refs: #26098 --- modules/python/package/cv2/__init__.py | 2 +- modules/python/src2/typing_stubs_generation/generation.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/python/package/cv2/__init__.py b/modules/python/package/cv2/__init__.py index 7e148fc9f2..11994a2cd3 100644 --- a/modules/python/package/cv2/__init__.py +++ b/modules/python/package/cv2/__init__.py @@ -26,7 +26,7 @@ def __load_extra_py_code_for_module(base, name, enable_debug_print=False): native_module = sys.modules.pop(module_name, None) try: py_module = importlib.import_module(module_name) - except ImportError as err: + except (ImportError, AttributeError) as err: if enable_debug_print: print("Can't load Python code for module:", module_name, ". Reason:", err) diff --git a/modules/python/src2/typing_stubs_generation/generation.py b/modules/python/src2/typing_stubs_generation/generation.py index 084a37a94b..07de26c0af 100644 --- a/modules/python/src2/typing_stubs_generation/generation.py +++ b/modules/python/src2/typing_stubs_generation/generation.py @@ -708,7 +708,7 @@ def _generate_typing_module(root: NamespaceNode, output_path: Path) -> None: """ def has_all_required_modules(type_node: TypeNode) -> bool: - return all(em in root.namespaces for em in node.required_modules) + return all(em in root.namespaces for em in type_node.required_modules) def register_alias_links_from_aggregated_type(type_node: TypeNode) -> None: assert isinstance(type_node, AggregatedTypeNode), \