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.
This commit is contained in:
Dylan Xu
2026-09-09 15:33:26 +08:00
parent 24c45b01ab
commit 318894c956

View File

@@ -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")