Fix: Windows DLL path lookup with Python >= 3.8
authorMichael Jeanson <mjeanson@efficios.com>
Wed, 11 Oct 2023 21:42:30 +0000 (17:42 -0400)
committerPhilippe Proulx <eeppeliteloop@gmail.com>
Thu, 12 Oct 2023 19:02:44 +0000 (15:02 -0400)
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 <mjeanson@efficios.com>
Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
Reviewed-on: https://review.lttng.org/c/babeltrace/+/11043

setup.cfg
src/bindings/python/bt2/bt2/__init__.py

index 1d29ccadf04b0031d7954fff124a4c3e55b3b868..9fbc23cf64fdacc7ec1ab0272df32fc24eecba31 100644 (file)
--- 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
index 089c98b076191e52638bf63a2da9bad0c9617efd..2dd7dc36b69ae1cace2ad37fd62ab5d6ce5a07ab 100644 (file)
@@ -2,8 +2,24 @@
 #
 # Copyright (c) 2017 Philippe Proulx <pproulx@efficios.com>
 
+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 <https://docs.python.org/3/whatsnew/3.8.html#bpo-36085-whatsnew>.
+#
+# 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,
This page took 0.028405 seconds and 4 git commands to generate.