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 ctypes
substance 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 int
so, alors que je spécifie int
comme 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 ctypes
fonction 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 ctypes
fonction distincte configurée par fonction de bibliothèque.
La valeur de retour de WINFUNCTYPE
est un prototype de fonction, mais vous devez toujours configurer plus d'informations sur les paramètres (au-delà des types). Chaque tuple dans hllApiParams
a 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 ctypes
pour plus de détails
Une fois que vous avez le prototype et les informations de paramètre, vous pouvez créer un Python "appelable" hllApi
avec lequel appeler la fonction. Vous créez simplement la variable nécessaire ( p1
via p4
dans mon cas) et appelez la fonction avec eux.