204 votes

Comment puis-je utiliser DLL à partir de Python

Quelle est la façon la plus simple d'utiliser une DLL à partir de l'intérieur de Python?

Plus précisément, comment cela peut-il être fait sans écrit supplémentaires wrapper C++ code pour exposer les fonctionnalités de Python?

Natif de la fonctionnalité Python est fortement privilégiée par rapport à l'aide d'un 3ème partie de la bibliothèque.

168voto

paxdiablo Points 341644

Je pense que ctypes est le chemin à parcourir.

L'exemple suivant de ctypes est de partir de la réalité de code que j'ai écrit (en Python 2.5). Cela a été, de loin, la façon la plus simple que j'ai trouvé pour faire ce que vous demandez.

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,ctypes.c_void_p,
    ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p)
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))

L' ctypes trucs a tous les C-types de données (int, char, short, void*, et ainsi de suite) et qui peuvent passer par valeur ou par référence. Il peut également renvoyer des types de données spécifiques bien que mon exemple ne pas le faire (HLL API retourne les valeurs par la modification d'une variable passée par référence).


Dans les conditions de l'exemple montré ci-dessus, IBM EHLLAPI est assez interface cohérente.

Tous les appels passent quatre pointeurs void (EHLLAPI envoie le code de retour en arrière dans le quatrième paramètre un pointeur vers une int ainsi, alors que je spécifier int que le type de retour, je peux l'ignorer) que par IBM documentation ici.

Cela rend pour une simple et unique ctypes fonction capable de faire tout ce que l'EHLLAPI bibliothèque fournit, mais il est probable que d'autres bibliothèques aurez besoin d'un autre ctypes de la fonction définie par la fonction bibliothèque.

La valeur de retour de WINFUNCTYPE est un prototype de fonction, mais vous avez encore de mettre en place plus d'informations de paramètre (au-dessus du types). Chaque tuple hllApiParams a un paramètre "direction" (1 = entrée, 2 = sortie et ainsi de suite), un nom de paramètre et une valeur par défaut - voir l' ctypes doco pour plus de détails

Une fois que vous avez le prototype et les informations de paramètre, vous pouvez créer un Python "callable" hllApi avec pour appeler la fonction. Il vous suffit de créer le besoin de variable (p1 par p4 dans mon cas) et d'appeler la fonction avec eux.

79voto

atul Points 141

Cette page est un exemple très simple de l'appel de fonctions à partir d'une dll.

Il est très facile d'appeler une fonction dll en Python. J'ai un self made dll avec deux fonctions: add et sub qui prennent deux arguments.

add(a, b) rendements de plus de deux nombres
sub(a, b) retours soustraction de deux nombres

Le nom de la dll sera "demo.dll"

Programme:

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

Sortie:

Addition value:-11
Substraction:-9

6voto

monkut Points 14549

ctypes peut être utilisé pour accéder à des dll, voici un tutoriel:

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

6voto

Carlos Gomez Points 1

peut-être avec l'Expédition

de win32com.client importation d'Expédition

zk = l'Envoi("zkemkeeper.ZKEM")

où zkemkeeper est une dll inscrite sur le système... après cela, vous pouvez accéder à des fonctions simplement en les appelant

zk.Connect_Net(ip,port)

1voto

Greg Hewgill Points 356191

Vous pouvez avoir un coup d'oeil à RASADE.

Je ne sais pas du tout les capacités au sein de la norme de bibliothèques Python pour faire ce genre de chose. Il ressemble à l' ctypes bibliothèque est nouveau dans la version 2.5 et prend en charge les Dll de l'appelant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X