Използване на dll на трети страни с ctypes в python, Blablacode

Страхотен и могъщ питон. Вярно е, че има моменти, когато искате да вмъкнете C код или нещо друго в кода на Python. Независимо дали е въпрос на изпълнение или нежелание да напише велосипед. Не е важното.

В Python има хубав модул за работа със споделени библиотеки - ctypes. За него по-нататък и реч. За да работите с външен dll, просто трябва да го импортирате и да извикате желаната функция, като съзнателно дефинирате необходимите типове данни. Моят пациент ще бъде modbus.dll от проекта libmodbus. Осигурява възможност да бъдете главен или клиент в Modbus мрежа без проблеми. За да тествам връзката, използвам ананаси.

ctypes

За да работите, трябва да дефинирате структури.

Също така, за да работите с библиотеката, имате нужда от структура, която съдържа указатели към функции.

Можете да го опишете така:

Както можете да видите, указателят на функция е описан с помощта на CFUNCTYPE. Тази функция приема като вход типа на върнатия резултат (или None в случай на void) и всички параметри. Указателите трябва да бъдат обвити в POINTER.

Подготвителната работа е завършена. Сега нека заредим dll и изпълним заявката.

Заредете dll с CDLL("path_to_dll"). След това можете да получите достъп до неговите функции.

Не забравяйте да добавите метода .encode() за параметри на низове в python 3. Това се дължи на факта, че той има Unicode низове, докато dll не.

Кодът може да се види в GitHub. Може би някой ден ще прерасне в нещо повече.

Понякога структурите се отнасят една към друга. Преводачът легитимно псува. Това може да се направи по следния начин: