From 578f3d7758a335fd0405d55b5b17e18948a32f10 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 (cherry picked from commit 86f24b106e04c81bf252f2a4b1b99ad99b938de8) Reviewed-on: https://review.lttng.org/c/babeltrace/+/11115 Tested-by: jenkins --- setup.cfg | 11 ++++++++--- src/bindings/python/bt2/bt2/__init__.py | 15 +++++++++++++++ 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/setup.cfg b/setup.cfg index 9a58dd3c..1c524c69 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 diff --git a/src/bindings/python/bt2/bt2/__init__.py b/src/bindings/python/bt2/bt2/__init__.py index 7068f240..73cc6688 100644 --- a/src/bindings/python/bt2/bt2/__init__.py +++ b/src/bindings/python/bt2/bt2/__init__.py @@ -20,8 +20,23 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. +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 + # import all public names from bt2.clock_class import ClockClassOffset from bt2.clock_snapshot import _ClockSnapshotConst -- 2.34.1