Для простоты использования, 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 отправляет код возврата через четвертый параметр, указатель на int
so, хотя я указываю 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
в моем случае) и вызываете функцию с ними.