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

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

В частности, как это можно сделать без написания какого-либо дополнительного кода С++ для оболочки, чтобы показать функциональность Python?

Функциональность Native Python настоятельно предпочтительнее использования сторонней библиотеки.

Ответ 1

Для удобства использования 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))

Материал ctypes имеет все типы данных типа C (int, char, short, void* и т.д.) и может проходить по значению или ссылке. Он также может возвращать определенные типы данных, хотя мой пример этого не делает (API HLL возвращает значения, изменяя переменную, переданную по ссылке).


В терминах конкретного примера, показанного выше, IBM EHLLAPI является довольно последовательным интерфейсом.

Все вызовы пропускают четыре указателя void (EHLLAPI отправляет код возврата обратно через четвертый параметр, указатель на int, поэтому, в то время как я указываю int как тип возвращаемого значения, я могу смело игнорировать его) в соответствии с IBM документация здесь. Другими словами, вариант C функции будет:

int hllApi (void *p1, void *p2, void *p3, void *p4)

Это делает единственную простую функцию ctypes, которая может делать все, что предоставляет библиотека EHLLAPI, но, вероятно, для других библиотек потребуется отдельная функция ctypes, установленная для каждой библиотечной функции.

Возвращаемое значение из WINFUNCTYPE является прототипом функции, но вам все равно нужно настроить дополнительную информацию о параметрах (сверх типов). Каждый кортеж в hllApiParams имеет параметр "direction" (1 = input, 2 = output и т.д.), Имя параметра и значение по умолчанию - подробнее см. ctypes doco

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

Ответ 2

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

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

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

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

Имя файла DLL будет "demo.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

Ответ 4

Возможно с Dispatch:

from win32com.client import Dispatch

zk = Dispatch("zkemkeeper.ZKEM") 

Где zkemkeeper - зарегистрированный DLL файл в системе... После этого вы можете получить доступ к функциям, просто вызвав их:

zk.Connect_Net(IP_address, port)

Ответ 5

ctypes будет самой простой вещью в использовании, но (неверно) с ее помощью Python подвернется сбою. Если вы пытаетесь сделать что-то быстро, и вы осторожны, это здорово.

Я бы посоветовал вам проверить Boost Python. Да, для этого требуется написать код на С++ и иметь компилятор С++, но на самом деле вам не нужно изучать С++, чтобы использовать его, и вы можете получить бесплатный (как в пиве) компилятор С++ из Microsoft.