Как я могу использовать DLL-файл из Python?
каков самый простой способ использовать DLL-файл из Python?
в частности, как это можно сделать без написание любого дополнительного кода оболочки C++ для предоставления функциональности Python?
встроенные функции Python является строго предпочтительным по сравнению с использованием сторонней библиотеки.
5 ответов:
для удобства использования 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))The
ctypesматериал имеет все типы данных C-типа (int,char,short,void*и так далее) и может передавать по значению или по ссылке. Он также может возвращать определенные типы данных, хотя мой пример этого не делает (HLL API возвращает значения, изменяя переменную, переданную по ссылке).
С точки зрения конкретного примера, показанного выше, IBM EHLLAPI является довольно последовательным интерфейсом.
все вызовы проходят четыре указателя void (EHLLAPI отправляет код возврата обратно через четвертый параметр, указатель на
intитак, пока я указываюintкак тип возврата, я могу спокойно игнорировать его) в соответствии с документацией IBM здесь. Другими словами, вариант C функция будет:int hllApi (void *p1, void *p2, void *p3, void *p4)это делает для одного, простого
ctypesфункция, способная делать все, что предоставляет библиотека EHLLAPI, но вполне вероятно, что другим библиотекам потребуется отдельныйctypesнастройка функции для каждой библиотечной функции.возвращаемое значение
WINFUNCTYPE- это прототип функции, но вам все равно придется настроить несколько параметров (и типов). Каждый Кортеж вhllApiParamsимеет параметр "направление" (1 = вход, 2 = выход и так далее о), имя параметра и значение по умолчанию - см.ctypesdoco для деталейкак только у вас есть прототип и информация о параметрах, вы можете создать Python "вызываемый"
hllApiС помощью которого можно вызвать функцию. Вы просто создаете необходимую переменную (p1черезp4в моем случае) и вызвать функцию с ними.
на этой странице имеет очень простой пример вызова функций из DLL-файла.
перефразируя детали здесь для полноты картины:
это очень легко вызвать функцию DLL в Python. У меня есть самодельный DLL-файл с двумя функциями:
addиsub, которые принимают два аргумента.
add(a, b)возвращает сложение двух чиселsub(a, b)возвращает вычитание двух чиселимя файл DLL будет "демо.DLL-файл"
программа:
from ctypes import*# give location of dllmydll = cdll.LoadLibrary("C:\demo.dll")result1= mydll.add(10,1)result2= mydll.sub(10,1)print "Addition value:"+result1print "Substraction:"+result2выход:
Addition value:11Substraction:9
ctypes будет проще всего использовать, но (mis)использование этого делает Python подверженным сбою. Если вы пытаетесь сделать что-то быстро, и вы осторожны, это здорово.
Я бы рекомендовал вам проверить Boost Python. Да, это требует, чтобы вы написали некоторый код C++ и имели компилятор C++, но вам на самом деле не нужно изучать C++, чтобы использовать его, и вы можете получить бесплатный (как в пиве) компилятор C++ от Microsoft.
может быть с
Dispatch:from win32com.client import Dispatch zk = Dispatch("zkemkeeper.ZKEM")где zkemkeeper является зарегистрированным DLL-файлом в системе... После этого вы можете получить доступ к функциям, просто вызвав их:
zk.Connect_Net(IP_address, port)
Comments