Pour la facilité d'utilisation, ctypes est la voie à suivre.
L'exemple suivant de ctypes provient du code que j'ai écrit (en Python 2.5). Cela a été, de loin, le moyen le plus simple que j'ai trouvé pour faire ce que vous demandez.
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 ctypessubstance possède tous les types de données de type C ( int, char, short, void*, etc.) et peut passer de la valeur ou de référence. Il peut également renvoyer des types de données spécifiques bien que mon exemple ne le fasse pas (l'API HLL renvoie des valeurs en modifiant une variable passée par référence).
En termes de l'exemple spécifique montré ci-dessus, EHLLAPI d'IBM est une interface assez cohérente.
Tous les appels passent quatre pointeurs vides (EHLLAPI renvoie le code de retour via le quatrième paramètre, un pointeur vers un intso, alors que je spécifie intcomme type de retour, je peux l'ignorer en toute sécurité) selon la documentation d'IBM ici . En d'autres termes, la variante C de la fonction serait:
int hllApi (void *p1, void *p2, void *p3, void *p4)
Cela en fait une ctypesfonction simple et unique capable de faire tout ce que la bibliothèque EHLLAPI fournit, mais il est probable que d'autres bibliothèques auront besoin d'une ctypesfonction distincte configurée par fonction de bibliothèque.
La valeur de retour de WINFUNCTYPEest un prototype de fonction, mais vous devez toujours configurer plus d'informations sur les paramètres (au-delà des types). Chaque tuple dans hllApiParamsa un paramètre "direction" (1 = entrée, 2 = sortie et ainsi de suite), un nom de paramètre et une valeur par défaut - voir le document ctypespour plus de détails
Une fois que vous avez le prototype et les informations de paramètre, vous pouvez créer un Python "appelable" hllApiavec lequel appeler la fonction. Vous créez simplement la variable nécessaire ( p1via p4dans mon cas) et appelez la fonction avec eux.