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

176
задан JackOLantern 4 April 2019 в 07:04
поделиться

4 ответа

Для простоты использования 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 путем изменения переменной, переданной ссылкой).

<час>

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

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

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

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

возвращаемое значение от [1 111] является прототипом функции, но все еще необходимо настроить больше информации о параметре (свыше типов). Каждый кортеж в [1 112] имеет параметр "направление" (1 = вход, 2 = вывод и так далее), название параметра и значение по умолчанию - видят ctypes doco для деталей

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

145
ответ дан paxdiablo 23 November 2019 в 20:23
поделиться

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

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

3
ответ дан Peter Mortensen 23 November 2019 в 20:23
поделиться

ctypes может привыкнуть к доступу dlls, вот учебное руководство:

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

7
ответ дан monkut 23 November 2019 в 20:23
поделиться

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

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

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

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

Имя DLL файла будет "demo.dll"

Программа:

from ctypes import*
# укажите местоположение dll
mydll = cdll. LoadLibrary("C:\\demo.dll")
result1= mydll.add(10,1)
result2= mydll.sub(10,1)
print "Addition value:"+result1
print "Substraction:"+result2

Output:

Addition value:11
Substraction:9

63
ответ дан 23 November 2019 в 20:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: