From 318894c9561f52b1ea01eb21432e1199ee212071 Mon Sep 17 00:00:00 2001 From: Dylan Xu Date: Wed, 9 Sep 2026 15:33:26 +0800 Subject: [PATCH] python: avoid empty LD_LIBRARY_PATH/PATH entries on import Joining BINARIES_PATHS with an unconditional trailing separator creates an empty search-path entry when the variable was unset. On POSIX that empty entry is CWD (ld.so), so children can load the wrong libraries. Keep prepending extras, but only insert the separator when an old value exists. Same join on Windows PATH. --- modules/python/package/cv2/__init__.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/modules/python/package/cv2/__init__.py b/modules/python/package/cv2/__init__.py index 11994a2cd3..99685b3791 100644 --- a/modules/python/package/cv2/__init__.py +++ b/modules/python/package/cv2/__init__.py @@ -20,6 +20,14 @@ except ImportError: # is_x64 = sys.maxsize > 2**32 +def _prepend_env_paths(env_key, paths, sep): + extra = [p for p in paths if p] + if not extra: + return + old = os.environ.get(env_key) + os.environ[env_key] = sep.join(extra) + ((sep + old) if old else '') + + def __load_extra_py_code_for_module(base, name, enable_debug_print=False): module_name = "{}.{}".format(__name__, name) export_module_name = "{}.{}".format(base, name) @@ -140,11 +148,11 @@ def bootstrap(): except Exception as e: if DEBUG: print('Failed os.add_dll_directory(): '+ str(e)) pass - os.environ['PATH'] = ';'.join(l_vars['BINARIES_PATHS']) + ';' + os.environ.get('PATH', '') - if DEBUG: print('OpenCV loader: PATH={}'.format(str(os.environ['PATH']))) + _prepend_env_paths('PATH', l_vars['BINARIES_PATHS'], ';') + if DEBUG: print('OpenCV loader: PATH={}'.format(str(os.environ.get('PATH')))) else: # amending of LD_LIBRARY_PATH works for sub-processes only - os.environ['LD_LIBRARY_PATH'] = ':'.join(l_vars['BINARIES_PATHS']) + ':' + os.environ.get('LD_LIBRARY_PATH', '') + _prepend_env_paths('LD_LIBRARY_PATH', l_vars['BINARIES_PATHS'], ':') if DEBUG: print("Relink everything from native cv2 module to cv2 package")