Използване на dll на трети страни с ctypes в python, Blablacode
Страхотен и могъщ питон. Вярно е, че има моменти, когато искате да вмъкнете C код или нещо друго в кода на Python. Независимо дали е въпрос на изпълнение или нежелание да напише велосипед. Не е важното.
В Python има хубав модул за работа със споделени библиотеки - ctypes. За него по-нататък и реч. За да работите с външен dll, просто трябва да го импортирате и да извикате желаната функция, като съзнателно дефинирате необходимите типове данни. Моят пациент ще бъде modbus.dll от проекта libmodbus. Осигурява възможност да бъдете главен или клиент в Modbus мрежа без проблеми. За да тествам връзката, използвам ананаси.
За да работите, трябва да дефинирате структури.
Също така, за да работите с библиотеката, имате нужда от структура, която съдържа указатели към функции.
Можете да го опишете така:
Както можете да видите, указателят на функция е описан с помощта на CFUNCTYPE. Тази функция приема като вход типа на върнатия резултат (или None в случай на void) и всички параметри. Указателите трябва да бъдат обвити в POINTER.
Подготвителната работа е завършена. Сега нека заредим dll и изпълним заявката.
Заредете dll с CDLL("path_to_dll"). След това можете да получите достъп до неговите функции.
Не забравяйте да добавите метода .encode() за параметри на низове в python 3. Това се дължи на факта, че той има Unicode низове, докато dll не.
Кодът може да се види в GitHub. Може би някой ден ще прерасне в нещо повече.
Понякога структурите се отнасят една към друга. Преводачът легитимно псува. Това може да се направи по следния начин: