I am trying to upgrade a library to Python 3.10. Up to now, I have been using 3.7.6.
In my library, I am using DLLs. In the package __init__.py, I add the DLL path to the PATH variable. Since I want to have the code compatible with 32 and 64 bit systems, I check the bitness at runtime and add the appropriate DLL folder to the PATH:
import os import sys # Add libs to PATH environment variable such that DLLs can be loaded. # Load either x64 or x86 depending on whether we are running a 32/64 # bit system. package_directory = os.path.dirname(os.path.abspath(__file__)) if sys.maxsize > 2**32: path_dir = os.path.join(package_directory, 'libs', 'x64') else: path_dir = os.path.join(package_directory, 'libs', 'x86') os.environ['PATH'] += os.pathsep + path_dir The corrresponding folder structure is
package_root |- libs |- x64 |- libbristolpolled.dll ... |- x86 |- libbristolpolled.dll ... Then in a sub-package, I am using:
from ctypes import CDLL dll = "libbristolpolled.dll" _lib_bristlp = CDLL(dll) This has worked fine in 3.7.6 but fails in 3.10.3 with the following error message:
File "C:\...\lib\site-packages\optoMD\sensor\optical\bristol\dll_api.py", line 37, in <module> _lib_bristlp = CDLL(dll) # The correct DLL File "C:\Program Files\Python310\lib\ctypes\__init__.py", line 374, in __init__ self._handle = _dlopen(self._name, mode) FileNotFoundError: Could not find module 'libbristolpolled.dll' (or one of its dependencies). Try using the full path with constructor syntax. If I instead use the absolute path, as the error message suggests, it works:
from ctypes import CDLL dll = r"C:\...\libs\x64\libbristolpolled.dll" _lib_bristlp = CDLL(dll) What is the reason the old method doesn't work anymore, or how can I make it work again? I'd prefer not to have absolute paths in my code and I liked the fact that I handle the DLL path once in the init file and afterwards I just need to import the DLL using the file name.