Какой самый простой способ использовать DLL
файл изнутриPython
?
В частности, как это можно сделать без написания какого-либо дополнительного C++
кода- обертки, чтобы раскрыть функциональность Python
?
Собственная Python
функциональность настоятельно предпочтительнее, чем использование сторонней библиотеки.
Ответы:
Для простоты использования, ctypes это путь.
Следующий пример ctypes взят из реального кода, который я написал (в Python 2.5). Это, безусловно, самый простой способ, который я нашел для выполнения того, что вы просите.
ctypes
Материал имеет все типы С-типа данных (int
,char
,short
,void*
, и т.д.) и может передавать по значению или ссылке. Он также может возвращать определенные типы данных, хотя мой пример этого не делает (HLL API возвращает значения путем изменения переменной, переданной по ссылке).С точки зрения конкретного примера, показанного выше, EHLLAPI от IBM представляет собой довольно непротиворечивый интерфейс.
Все вызовы проходят четыре пустых указателя (EHLLAPI отправляет код возврата через четвертый параметр, указатель на
int
so, хотя я указываюint
в качестве типа возврата, я могу смело его игнорировать) согласно документации IBM здесь . Другими словами, вариант C функции будет:Это делает единственную простую
ctypes
функцию, способную делать все, что обеспечивает библиотека EHLLAPI, но вполне вероятно, что другим библиотекам потребуется отдельнаяctypes
функция, настроенная для каждой библиотечной функции.Возвращаемое значение from
WINFUNCTYPE
является прототипом функции, но вам все равно нужно настроить дополнительную информацию о параметрах (помимо типов). Каждый кортежhllApiParams
имеет параметр "direction" (1 = вход, 2 = выход и т. Д.), Имя параметра и значение по умолчанию - подробности см. Вctypes
документеКогда у вас есть прототип и информация о параметрах, вы можете создать Python, «вызываемый»
hllApi
для вызова функции. Вы просто создаете необходимую переменную (p1
черезp4
в моем случае) и вызываете функцию с ними.источник
hllApiParams
? Какой смысл этих кортежей? Трудно сопоставить некоторые вещи в этом примере с документацией.На этой странице приведен очень простой пример вызова функций из DLL-файла.
Перефразируя детали здесь для полноты:
источник
ctypes можно использовать для доступа к dll, вот учебник:
http://docs.python.org/library/ctypes.html#module-ctypes
источник
Может быть с
Dispatch
:Где zkemkeeper - зарегистрированный файл DLL в системе ... После этого вы можете получить доступ к функциям, просто вызвав их:
источник
Сборка DLL и связывание ее под Python с использованием ctypes
Я представляю полностью проработанный пример того, как построить
shared library
и использовать егоPython
с помощьюctypes
. Я рассматриваюWindows
дело и занимаюсьDLLs
. Требуются два шага:Общая библиотека
shared library
Я считаю , заключается в следующем , и содержится вtestDLL.cpp
файле. Единственная функцияtestDLL
просто получаетint
и печатает его.Сборка DLL из командной строки
Чтобы построить
DLL
сVisual Studio
из командной строки запуститьустановить путь включения, а затем запустить
построить DLL.
Сборка
DLL
из IDEВ качестве альтернативы,
DLL
сборка может быть выполненаVisual Studio
следующим образом:Связывание DLL под Python
Под Python сделайте следующее
источник
ctypes будет проще всего использовать, но (неправильное) его использование приводит к краху Python. Если вы пытаетесь что-то сделать быстро и осторожны, это здорово.
Я бы посоветовал вам проверить Boost Python . Да, это требует, чтобы вы написали некоторый код C ++ и имели компилятор C ++, но на самом деле вам не нужно изучать C ++, чтобы использовать его, и вы можете получить бесплатный (как в пиве) компилятор C ++ от Microsoft .
источник
Если DLL имеет тип библиотеки COM, то вы можете использовать pythonnet.
Затем в вашем коде Python попробуйте следующее
затем создайте экземпляр объекта согласно классу в DLL и получите доступ к методам в нем.
источник