Для зручності використання ctypes - це шлях.
Наступний приклад ctypes - це фактичний код, який я написав (у Python 2.5). Це був, безумовно, найпростіший спосіб, який я знайшов для того, щоб робити те, що ви просите.
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))
ctypesМатеріал має всі типи С-типу даних ( int, char, short, void*, і т.д.) і може передавати за значенням або посиланням. Він також може повертати конкретні типи даних, хоча мій приклад цього не робить (API HLL повертає значення, змінюючи змінну, передану посиланням).
З точки зору конкретного прикладу, показаного вище, EHLLAPI IBM є досить послідовним інтерфейсом.
Усі виклики передають чотири недійсні покажчики (EHLLAPI посилає повертаючий код назад через четвертий параметр, вказівник на intтак, в той час як я вказуюint як тип повернення, я можу сміливо ігнорувати його) згідно документації IBM тут . Іншими словами, варіантом функції C буде:
int hllApi (void *p1, void *p2, void *p3, void *p4)
Це створює єдину просту ctypesфункцію, здатну виконувати все, що надається бібліотеці EHLLAPI, але ймовірно, що для інших бібліотек знадобиться окрема ctypesфункція, налаштована на кожну функцію бібліотеки.
Повернене значення від WINFUNCTYPE - це прототип функції, але вам все одно доведеться встановити більше інформації про параметри (вище і вище типів). Кожен кортеж hllApiParamsмає параметр "напрям" (1 = вхід, 2 = вихід тощо), ім'я параметра та значення за замовчуванням - ctypesдетальну інформацію див. У документі
Коли ви отримаєте інформацію про прототип і параметри, ви можете створити Python "calllable", за hllApiдопомогою якого можна викликати функцію. Ви просто створити необхідну змінну ( p1через p4в моєму випадку) і викличте функцію з ними.