2009-12-21 25 views
15

Estoy cargando un archivo DLL en Python usando siguiente código:WindowsError: [Error 126] El módulo especificado no se pudo encontrar

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

Pero me estoy continuamente el siguiente error

WindowsError: [ Error 126] El módulo especificado no se pudo encontrar

dll está presente en la ruta especificada, pero no entendí por qué recibo el error.

+0

¿Puede detallar la DLL que está tratando de importar y qué hace esa DLL? Puede estar intentando cargar otra DLL que no puede encontrar. – santosc

+0

La respuesta a [esta pregunta] (http://stackoverflow.com/questions/2334627/error-loading-dll-in-path-with-parenthesis-using-ctypes-python) me la resolvió: ¿duplicar? – Junuxx

Respuesta

12

Cuando veo cosas como esto - por lo general es porque hay barras invertidas en el camino que se convierten

Por ejemplo, lo siguiente fallará porque \ t en la cadena se convierte en carácter TAB.

>>> 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 

Hay 3 soluciones (si ese es el problema)

a) el uso dobles barras ...

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

b) emplear la barra

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

c) utilice cadenas RAW (prefabricando la cadena con r

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

Mientras funciona este tercero, he tenido la impresión de vez en cuando de que no se considera "correcto" porque las cadenas RAW estaban destinadas a expresiones regulares. Lo he estado usando para rutas en Windows en Python durante años sin problema :))

-3

Compruebe el nombre del archivo DLL .. no debe contener cualquier letra mayúscula .. estar dotados de todos los caracteres en minúsculas para compilar correctamente

+0

Eso es incorrecto a) de Windows Caminos no son sensibles b) incluso cuando se utiliza ctypes.windll.dll_name - puede seguir utilizando mayúsculas y minúsculas: '' >>> ctypes.windll.UseR32.MessageBoxA' <_FuncPtr Objeto en 0x01DEA648> ' – markm

0

También podría ser que haya olvidado configurar su directorio de trabajo en eclipse para que sea el local correcto para que se ejecute la aplicación.

14

Tenga en cuenta que incluso si la DLL está en su camino. Si esa DLL se basa en otras DLL que NO están en su ruta, puede obtener el mismo error. Windows no pudo encontrar una dependencia en este caso. Windows no es muy bueno para decirte lo que no pudo encontrar, solo que no encontró nada. Depende de usted darse cuenta de eso. La ruta de búsqueda dll de Windows se puede encontrar aquí: http://msdn.microsoft.com/en-us/library/7d83bc18.aspx

En mi caso, asegurándome de que todos los archivos DLL necesarios estaban en el mismo directorio y hacer un directorio os.chdir() para ese directorio resolvió el problema.

+3

Solo mencionar que" os.chdir() "(aunque no estoy seguro de si esta es la manera correcta de manejar el problema) me ayudó después de probar las opciones mencionadas en la respuesta marcada – JavierQQ23

+0

Una alternativa al uso os.chdir() es para asegurarse de que el directorio con los dlls está en su camino. De cualquier manera, permite que Windows encuentre las dlls –

1

Me encontré con el mismo problema en Win10 32bit OS. Resolví el problema cambiando la DLL de la depuración a la versión de lanzamiento.

Creo que es porque la versión de depuración DLL depende de otra DLL, y la versión de lanzamiento no.

Cuestiones relacionadas