Para facilidad de 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, de lejos, la forma más fácil que he encontrado para hacer lo que me pides.
import ctypes
# Load DLL into memory.
hllDll = ctypes.WinDLL ("c:\\PComm\\ehlapi32.dll")
# Set up prototype and parameters for the desired function call.
# HLLAPI
hllApiProto = ctypes.WINFUNCTYPE (
ctypes.c_int, # Return type.
ctypes.c_void_p, # Parameters 1 ...
ctypes.c_void_p,
ctypes.c_void_p,
ctypes.c_void_p) # ... thru 4.
hllApiParams = (1, "p1", 0), (1, "p2", 0), (1, "p3",0), (1, "p4",0),
# Actually map the call ("HLLAPI(...)") to a Python name.
hllApi = hllApiProto (("HLLAPI", hllDll), hllApiParams)
# This is how you can actually call the DLL function.
# Set up the variables and call the Python name with them.
p1 = ctypes.c_int (1)
p2 = ctypes.c_char_p (sessionVar)
p3 = ctypes.c_int (1)
p4 = ctypes.c_int (0)
hllApi (ctypes.byref (p1), p2, ctypes.byref (p3), ctypes.byref (p4))
La materia ctypes
tiene todos los tipos de datos de tipo C (int
, char
, short
, void*
, etc.) 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 mediante la modificación de una variable pasada por referencia).
En términos del ejemplo específico mostrado anteriormente, EHLLAPI de IBM es una interfaz bastante consistente.
Todas las llamadas pasan cuatro punteros void (EHLLAPI envía el código de retorno de nuevo a través del cuarto parámetro, un puntero a un int
así, mientras que especifico int
como el tipo de retorno, que puede pasar por alto que) de acuerdo con la documentación de IBM here. En otras palabras, la variante C de la función sería:
int hllApi (void *p1, void *p2, void *p3, void *p4)
Esto hace que para una sola función simple, ctypes
capaz de hacer cualquier cosa la biblioteca EHLLAPI ofrece, pero es probable que otras bibliotecas tendrán una función separada ctypes
configurar 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 (por encima de los tipos). Cada tupla en hllApiParams
tiene una "dirección" de parámetros (1 = entrada, 2 = salida y así sucesivamente), un nombre de parámetro y un valor por defecto - ver el mana ctypes
para más detalles
Una vez que tenga la información de prototipo y de parámetros, puede crear un Python "invocable" hllApi
con el que llamar a la función. Simplemente cree la variable necesaria (p1
hasta p4
en mi caso) y llame a la función con ellos.
@Remuze tenía que etiquetar la pregunta equivocada o etiqueta con la respuesta incorrecta? Ambos son pitón, pero no veo ninguna razón para que los encuentres en absoluto similares (y revisé el historial de revisión para asegurarme de que de alguna manera no estaba más cerca en algún momento del pasado) – Foon
@foon hmmm sí lo siento, Quería marcar otra pregunta como duplicada y poner esta :) ¡Supongo que eso demuestra lo similares que son! –