Quelle est la manière la plus simple d'utiliser un DLL
fichier de l'intérieurPython
?
Plus précisément, comment cela peut-il être fait sans écrire de C++
code wrapper supplémentaire pour exposer la fonctionnalité Python
?
La Python
fonctionnalité native est fortement préférée à l'utilisation d'une bibliothèque tierce.
Réponses:
Pour la facilité d'utilisation, ctypes est la voie à suivre.
L'exemple suivant de ctypes provient du code que j'ai écrit (en Python 2.5). Cela a été, de loin, le moyen le plus simple que j'ai trouvé pour faire ce que vous demandez.
La
ctypes
substance possède tous les types de données de type C (int
,char
,short
,void*
, etc.) et peut passer de la valeur ou de référence. Il peut également renvoyer des types de données spécifiques bien que mon exemple ne le fasse pas (l'API HLL renvoie des valeurs en modifiant une variable passée par référence).En termes de l'exemple spécifique montré ci-dessus, EHLLAPI d'IBM est une interface assez cohérente.
Tous les appels passent quatre pointeurs vides (EHLLAPI renvoie le code de retour via le quatrième paramètre, un pointeur vers un
int
so, alors que je spécifieint
comme type de retour, je peux l'ignorer en toute sécurité) selon la documentation d'IBM ici . En d'autres termes, la variante C de la fonction serait:Cela en fait une
ctypes
fonction simple et unique capable de faire tout ce que la bibliothèque EHLLAPI fournit, mais il est probable que d'autres bibliothèques auront besoin d'unectypes
fonction distincte configurée par fonction de bibliothèque.La valeur de retour de
WINFUNCTYPE
est un prototype de fonction, mais vous devez toujours configurer plus d'informations sur les paramètres (au-delà des types). Chaque tuple danshllApiParams
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 le documentctypes
pour plus de détailsUne fois que vous avez le prototype et les informations de paramètre, vous pouvez créer un Python "appelable"
hllApi
avec lequel appeler la fonction. Vous créez simplement la variable nécessaire (p1
viap4
dans mon cas) et appelez la fonction avec eux.la source
hllApiParams
? Quel est l'intérêt de ces tuples? Il est difficile de faire correspondre certaines des choses de cet exemple avec la documentation.Cette page présente un exemple très simple d'appel de fonctions à partir d'un fichier DLL.
Paraphrasant les détails ici par souci d'exhaustivité:
la source
ctypes peut être utilisé pour accéder aux dll, voici un tutoriel:
http://docs.python.org/library/ctypes.html#module-ctypes
la source
Peut-être avec
Dispatch
:Où zkemkeeper est un fichier DLL enregistré sur le système ... Après cela, vous pouvez accéder aux fonctions simplement en les appelant:
la source
Construire une DLL et la lier sous Python à l'aide de ctypes
Je présente un exemple entièrement travaillé sur la façon de construire un
shared library
et de l'utiliserPython
au moyen dectypes
. Je considère leWindows
cas et je traiteDLLs
. Deux étapes sont nécessaires:La bibliothèque partagée
Le que
shared library
je considère est le suivant et est contenu dans letestDLL.cpp
dossier. La seule fonctiontestDLL
reçoit juste unint
et l'imprime.Construire la DLL à partir de la ligne de commande
Pour créer un
DLL
avec àVisual Studio
partir de la ligne de commande, exécutezpour définir le chemin d'inclusion, puis exécutez
pour créer la DLL.
Construire le à
DLL
partir de l'IDEAlternativement, le
DLL
peut être construitVisual Studio
comme suit:Lier la DLL sous Python
Sous Python, procédez comme suit
la source
ctypes sera la chose la plus simple à utiliser mais (mal) l'utiliser rend Python sujet au crash. Si vous essayez de faire quelque chose rapidement et que vous faites attention, c'est génial.
Je vous encourage à consulter Boost Python . Oui, cela nécessite que vous écriviez du code C ++ et que vous ayez un compilateur C ++, mais vous n'avez pas réellement besoin d'apprendre C ++ pour l'utiliser, et vous pouvez obtenir un compilateur C ++ gratuit (comme dans la bière) de Microsoft .
la source
Si la DLL est de type bibliothèque COM, vous pouvez utiliser pythonnet.
Ensuite, dans votre code python, essayez ce qui suit
puis instanciez un objet selon la classe dans la DLL et accédez aux méthodes qu'il contient.
la source