Search code examples
pythonctypes

WindowsError: [Error 126] The specified module could not be found


I am loading a dll in python using following code:

if os.path.exists(dll_path):
     my_dll = ctypes.cdll.LoadLibrary(dll_path)

But I am continuously getting the following error

WindowsError: [Error 126] The specified module could not be found

dll is present at the specified path, but I didn't understand why I'm getting the error.


Solution

  • When I see things like this - it is usually because there are backslashes in the path which get converted.

    For example - the following will fail - because \t in the string is converted to TAB character.

    >>> import ctypes
    >>> ctypes.windll.LoadLibrary("c:\tools\depends\depends.dll")
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "c:\tools\python271\lib\ctypes\__init__.py", line 431, in LoadLibrary
        return self._dlltype(name)
      File "c:\tools\python271\lib\ctypes\__init__.py", line 353, in __init__
        self._handle = _dlopen(self._name, mode)
    WindowsError: [Error 126] The specified module could not be found
    

    There are 3 solutions (if that is the problem)

    a) Use double slashes...

    >>> import ctypes
    >>> ctypes.windll.LoadLibrary("c:\\tools\\depends\\depends.dll")
    

    b) use forward slashes

    >>> import ctypes
    >>> ctypes.windll.LoadLibrary("c:/tools/depends/depends.dll")
    

    c) use RAW strings (prefacing the string with r

    >>> import ctypes
    >>> ctypes.windll.LoadLibrary(r"c:\tools\depends\depends.dll")
    

    While this third one works - I have gotten the impression from time to time that it is not considered 'correct' because RAW strings were meant for regular expressions. I have been using it for paths on Windows in Python for years without problem :) )