Для простоты использования, 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*, и т.д.) и может передавать по значению или ссылке. Он также может возвращать определенные типы данных, хотя мой пример этого не делает (HLL API возвращает значения путем изменения переменной, переданной по ссылке).
С точки зрения конкретного примера, показанного выше, EHLLAPI от IBM представляет собой довольно непротиворечивый интерфейс.
Все вызовы проходят четыре пустых указателя (EHLLAPI отправляет код возврата через четвертый параметр, указатель на intso, хотя я указываю intв качестве типа возврата, я могу смело его игнорировать) согласно документации IBM здесь . Другими словами, вариант C функции будет:
int hllApi (void *p1, void *p2, void *p3, void *p4)
Это делает единственную простую ctypesфункцию, способную делать все, что обеспечивает библиотека EHLLAPI, но вполне вероятно, что другим библиотекам потребуется отдельнаяctypes функция, настроенная для каждой библиотечной функции.
Возвращаемое значение from WINFUNCTYPEявляется прототипом функции, но вам все равно нужно настроить дополнительную информацию о параметрах (помимо типов). Каждый кортеж hllApiParamsимеет параметр "direction" (1 = вход, 2 = выход и т. Д.), Имя параметра и значение по умолчанию - подробности см. В ctypesдокументе
Когда у вас есть прототип и информация о параметрах, вы можете создать Python, «вызываемый» hllApiдля вызова функции. Вы просто создаете необходимую переменную ( p1через p4в моем случае) и вызываете функцию с ними.