2012-05-02 17 views
11

Esto funciona bien en Windows 7 con Python 2.7:WindowsError: [Error 126] cuando se carga un archivo DLL con ctypes

lib = ctypes.cdll.LoadLibrary('prov_means') 
provmeans = lib.provmeans 

La biblioteca prov_means.DLL está en mi directorio de trabajo. Exporta una función de C simple, independiente provmeans() sin dependencias.

Cuando intento lo mismo en Windows XP y Python 2.7 me sale

Traceback (most recent call last): 
    File "D:\python\Auxil\src\auxil.py", line 130, in <module> 
    lib = ctypes.cdll.LoadLibrary('prov_means') 
    File "C:\Python27\lib\ctypes\__init__.py", line 431, in LoadLibrary 
    return self._dlltype(name) 
    File "C:\Python27\lib\ctypes\__init__.py", line 353, in __init__ 
    self._handle = _dlopen(self._name, mode) 
WindowsError: [Error 126] The specified module could not be found 

he tratado de copiar el archivo DLL para Windows \ System32 y también entrar en el nombre de ruta completo

"d:\\python\\auxil\\src\\prov_means" 

con y sin la extensión ".DLL". Nada funciona.

Respuesta

20

El error 126 es lo que obtienes cuando no se puede encontrar una DLL dependiente. Hay dos causas obvias para esto:

  1. No se ha localizado su DLL.
  2. Su DLL depende de otras DLL que no se pueden encontrar.

Dudo que la opción 1 sea el problema, pero en cualquier caso, creo que probablemente usaría una ruta completa a esa DLL para estar seguro.

De modo que deja la opción 2 y la causa más común para eso es que su máquina de destino no tiene instalado el tiempo de ejecución C++. Instale el tiempo de ejecución de C++ en su equipo de destino o use enlaces estáticos, /MT, al compilar su archivo DLL para que no tenga que redistribuir el tiempo de ejecución.

Probablemente, en la máquina que desarrolló la DLL, ha instalado un compilador de C++ y que instaló el tiempo de ejecución para usted. En su máquina de destino, donde falla el código, no ha instalado el compilador y, por lo tanto, el tiempo de ejecución no está presente.

+0

Gracias David. Eso sonó muy plausible cuando compilé en la máquina de Windows 7 con Visual Studio 2010 Express, que no está en la máquina de destino. Instalé el tiempo de ejecución de C++ en la máquina de destino como se sugirió y reinicié. Mismo error por desgracia. – MortCanty

+0

Puede usar Dependency Walker en modo de perfil para verificar esto. Pero consideraría reconstruir el archivo DLL con '/ MT' solo para verificar que no sea esa la causa del problema. –

+0

Derecha, acaba de reconstruir con/MT y ahora se ejecuta en el objetivo. ¡Muchas gracias! – MortCanty

0

¿Qué compilador utilizó para construir la biblioteca? ¿Tal vez faltan algunas bibliotecas requeridas? Puede verificar qué dependencias tiene la biblioteca con Dependency Walker (http://www.dependencywalker.com/).

Cuestiones relacionadas