Для простоты использования 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
материал имеет все типы данных C-типа (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
функция, настроенная на библиотечную функцию.
возвращаемое значение от [1 111] является прототипом функции, но все еще необходимо настроить больше информации о параметре (свыше типов). Каждый кортеж в [1 112] имеет параметр "направление" (1 = вход, 2 = вывод и так далее), название параметра и значение по умолчанию - видят ctypes
doco для деталей
, Как только у Вас есть прототип и информация о параметре, можно создать Python "вызываемый" hllApi
, с которым можно вызвать функцию. Вы просто создаете необходимую переменную (p1
до [1 116] в моем случае) и вызываете функцию с ними.
ctypes будет самой легкой вещью использовать, но (mis) использование его делает Python подвергающимся катастрофическому отказу. При попытке сделать что-то быстро, и Вы осторожны, это является большим.
я поощрил бы Вас проверять Повышение Python . Да, это требует, чтобы Вы записали некоторый код C++ и имели компилятор C++, но Вы не должны на самом деле изучать C++ для использования его, и можно получить свободное (как в пиве) компилятор C++ от Microsoft.
ctypes может привыкнуть к доступу dlls, вот учебное руководство:
На этой странице есть очень простой пример вызова функций из DLL-файла.
Перефразируя детали здесь для полноты:
Вызвать функцию DLL в Python очень просто. У меня есть самодельный DLL-файл с двумя функциями:
add
иsub
, которые принимают два аргумента.
add(a, b)
возвращает сложение двух чисел
sub(a, b)
возвращает вычитание двух чиселИмя DLL файла будет "demo.dll"
Программа:
from ctypes import*
# укажите местоположение dll
mydll = cdll. LoadLibrary("C:\\demo.dll")
result1= mydll.add(10,1)
result2= mydll.sub(10,1)
print "Addition value:"+result1
print "Substraction:"+result2
Output:
Addition value:11
Substraction:9