¿Cuál es la forma más fácil de usar un DLL
archivo desde dentro Python
?
Específicamente, ¿cómo se puede hacer esto sin escribir ningún C++
código contenedor adicional para exponer la funcionalidad Python
?
Python
Se prefiere la funcionalidad nativa sobre el uso de una biblioteca de terceros.
Respuestas:
Para facilitar su uso, ctypes es el camino a seguir.
El siguiente ejemplo de ctypes es del código real que he escrito (en Python 2.5). Esta ha sido, con mucho, la forma más fácil que he encontrado para hacer lo que pides.
El
ctypes
material tiene todos los tipos de tipo C de datos (int
,char
,short
,void*
, y así sucesivamente) y puede pasar por valor o referencia. También puede devolver tipos de datos específicos, aunque mi ejemplo no lo hace (la API HLL devuelve valores modificando una variable pasada por referencia).En términos del ejemplo específico que se muestra arriba, EHLLAPI de IBM es una interfaz bastante consistente.
Todas las llamadas pasan cuatro punteros vacíos (EHLLAPI envía el código de retorno de regreso a través del cuarto parámetro, un puntero a un
int
punto, mientras que especificoint
como tipo de retorno, puedo ignorarlo de manera segura) según la documentación de IBM aquí . En otras palabras, la variante C de la función sería:Esto hace que una función única y simple
ctypes
pueda hacer cualquier cosa que la biblioteca EHLLAPI proporcione, pero es probable que otras bibliotecas necesiten unactypes
función separada configurada por función de biblioteca.El valor de retorno de
WINFUNCTYPE
es un prototipo de función, pero aún debe configurar más información de parámetros (además de los tipos). Cada tuplahllApiParams
tiene un parámetro "dirección" (1 = entrada, 2 = salida, etc.), un nombre de parámetro y un valor predeterminado; consulte el documentoctypes
para obtener más información.Una vez que tenga la información del prototipo y los parámetros, puede crear un Python "invocable"
hllApi
con el que llamar a la función. Sólo tiene que crear la variable sea necesario (p1
a travésp4
en mi caso) y llama a la función con ellos.fuente
hllApiParams
? ¿Cuál es el punto de esas tuplas? Es difícil hacer coincidir algunas de las cosas en este ejemplo con la documentación.Esta página tiene un ejemplo muy simple de llamar a funciones desde un archivo DLL.
Parafraseando los detalles aquí para completar:
fuente
Los ctypes se pueden usar para acceder a los dlls, aquí hay un tutorial:
http://docs.python.org/library/ctypes.html#module-ctypes
fuente
Quizás con
Dispatch
:Donde zkemkeeper es un archivo DLL registrado en el sistema ... Después de eso, puede acceder a las funciones con solo llamarlas:
fuente
Construyendo una DLL y vinculándola bajo Python usando ctypes
Presento un ejemplo completamente trabajado sobre cómo construir un
shared library
y usarloPython
por medio dectypes
. Considero elWindows
caso y tratoDLLs
. Se necesitan dos pasos:La biblioteca compartida
Lo
shared library
que considero es lo siguiente y está contenido en eltestDLL.cpp
archivo. La única funcióntestDLL
solo recibe unint
e lo imprime.Construyendo la DLL desde la línea de comando
Para construir un
DLL
conVisual Studio
desde la línea de comando, ejecutapara establecer la ruta de inclusión y luego ejecutar
para construir la DLL.
Construyendo
DLL
desde el IDEAlternativamente,
DLL
se puede construir usandoVisual Studio
lo siguiente:Vinculación de la DLL en Python
En Python, haga lo siguiente
fuente
Los ctypes serán lo más fácil de usar pero (mal) usarlo hace que Python esté sujeto a fallas. Si está tratando de hacer algo rápidamente y tiene cuidado, es genial.
Te animo a que revises Boost Python . Sí, requiere que escriba un código C ++ y tenga un compilador C ++, pero en realidad no necesita aprender C ++ para usarlo, y puede obtener un compilador C ++ gratuito (como en cerveza) de Microsoft .
fuente
Si la DLL es de tipo biblioteca COM, puede usar pythonnet.
Luego, en su código de Python, intente lo siguiente
luego instanciar un objeto según la clase en la DLL, y acceder a los métodos dentro de él.
fuente