From 86f24b106e04c81bf252f2a4b1b99ad99b938de8 Mon Sep 17 00:00:00 2001 From: Michael Jeanson Date: Wed, 11 Oct 2023 17:42:30 -0400 Subject: [PATCH] Fix: Windows DLL path lookup with Python >= 3.8 Starting with Python 3.8 on Windows [1] the DLLs lookup when loading native modules was changed to not search PATH like everything else on this platform. Restore this behavior by doing it manually. Simon adds: it only started to matter now because MSYS2 dropped a local patch [2] that retained the old behaviour. [1]: https://docs.python.org/3/library/os.html#os.add_dll_directory [2]: https://www.msys2.org/news/#2023-08-06-python-changed-behavior-when-loading-dll-dependencies-of-extension-modules Change-Id: Id436244a717f440db11c33b6d418f31c7838591d Signed-off-by: Michael Jeanson Signed-off-by: Philippe Proulx Reviewed-on: https://review.lttng.org/c/babeltrace/+/11043 --- setup.cfg | 11 ++++++++--- src/bindings/python/bt2/bt2/__init__.py | 16 ++++++++++++++++ 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/setup.cfg b/setup.cfg index 1d29ccad..9fbc23cf 100644 --- a/setup.cfg +++ b/setup.cfg @@ -4,8 +4,13 @@ # formatting) ignore = E501,W503 -# __init__.py has a bunch of (expectedly) unused imports, so disable that -# warning for this file. -per-file-ignores = src/bindings/python/bt2/bt2/__init__.py:F401 +# Disabled warnings for `bt2/__init__.py`: +# +# F401: +# Has a bunch of (expectedly) unused imports. +# +# E402: +# Has code to set up the DLL search path before imports. +per-file-ignores = src/bindings/python/bt2/bt2/__init__.py:F401,E402 exclude = tests/utils/python/tap tests/utils/python/local_typing.py diff --git a/src/bindings/python/bt2/bt2/__init__.py b/src/bindings/python/bt2/bt2/__init__.py index 089c98b0..2dd7dc36 100644 --- a/src/bindings/python/bt2/bt2/__init__.py +++ b/src/bindings/python/bt2/bt2/__init__.py @@ -2,8 +2,24 @@ # # Copyright (c) 2017 Philippe Proulx +import os import sys +# With Python ≥ 3.8 on Windows, the DLL lookup mechanism to load native +# modules doesn't search the `PATH` environment variable like everything +# else on this platform. +# +# See . +# +# Restore this behaviour by doing it manually. +if os.name == "nt" and sys.version_info >= (3, 8): + for path in os.getenv("PATH", "").split(os.pathsep): + if os.path.exists(path) and path != ".": + os.add_dll_directory(path) + +del os + + from bt2.mip import get_maximal_mip_version, get_greatest_operative_mip_version from bt2.error import ( ComponentClassType, -- 2.34.1