Je pense que ctypes est le chemin à parcourir.
L'exemple suivant de ctypes est de partir de la réalité de code que j'ai écrit (en Python 2.5). Cela a été, de loin, la façon la 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,ctypes.c_void_p,
ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p)
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))
L' ctypes
trucs a tous les C-types de données (int
, char
, short
, void*
, et ainsi de suite) et qui peuvent passer par valeur ou par référence. Il peut également renvoyer des types de données spécifiques bien que mon exemple ne pas le faire (HLL API retourne les valeurs par la modification d'une variable passée par référence).
Dans les conditions de l'exemple montré ci-dessus, IBM EHLLAPI est assez interface cohérente.
Tous les appels passent quatre pointeurs void (EHLLAPI envoie le code de retour en arrière dans le quatrième paramètre un pointeur vers une int
ainsi, alors que je spécifier int
que le type de retour, je peux l'ignorer) que par IBM documentation ici.
Cela rend pour une simple et unique ctypes
fonction capable de faire tout ce que l'EHLLAPI bibliothèque fournit, mais il est probable que d'autres bibliothèques aurez besoin d'un autre ctypes
de la fonction définie par la fonction bibliothèque.
La valeur de retour de WINFUNCTYPE
est un prototype de fonction, mais vous avez encore de mettre en place plus d'informations de paramètre (au-dessus du types). Chaque tuple 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 l' ctypes
doco pour plus de détails
Une fois que vous avez le prototype et les informations de paramètre, vous pouvez créer un Python "callable" hllApi
avec pour appeler la fonction. Il vous suffit de créer le besoin de variable (p1
par p4
dans mon cas) et d'appeler la fonction avec eux.