Как я могу использовать DLL-файл из Python?



каков самый простой способ использовать DLL-файл из Python?



в частности, как это можно сделать без написание любого дополнительного кода оболочки C++ для предоставления функциональности Python?



встроенные функции Python является строго предпочтительным по сравнению с использованием сторонней библиотеки.

1245   5  

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 = выход и так далее о), имя параметра и значение по умолчанию - см. ctypes doco для деталей

как только у вас есть прототип и информация о параметрах, вы можете создать Python "вызываемый" hllApi С помощью которого можно вызвать функцию. Вы просто создаете необходимую переменную (p1 через p4 в моем случае) и вызвать функцию с ними.

на этой странице имеет очень простой пример вызова функций из DLL-файла.

перефразируя детали здесь для полноты картины:

это очень легко вызвать функцию DLL в Python. У меня есть самодельный DLL-файл с двумя функциями:add и sub, которые принимают два аргумента.

add(a, b) возвращает сложение двух чисел
sub(a, b) возвращает вычитание двух чисел

имя файл DLL будет "демо.DLL-файл"

программа:

from ctypes import*
# give location of dll
mydll = cdll.LoadLibrary("C:\demo.dll")
result1= mydll.add(10,1)
result2= mydll.sub(10,1)
print "Addition value:"+result1
print "Substraction:"+result2

выход:

Addition value:11
Substraction:9

ctypes можно использовать для доступа к DLL, вот учебник:

http://docs.python.org/library/ctypes.html#module-ctypes

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

    Ничего не найдено.