Was ist der einfachste Weg, eine DLL
Datei von innen zu verwenden Python
?
Wie kann dies konkret durchgeführt werden, ohne zusätzlichen Wrapper- C++
Code zu schreiben , dem die Funktionalität ausgesetzt werden soll Python
?
Native Python
Funktionen werden der Verwendung einer Bibliothek eines Drittanbieters dringend vorgezogen.
Antworten:
Zur Vereinfachung der Verwendung ist ctypes der richtige Weg.
Das folgende Beispiel für ctypes stammt aus dem von mir geschriebenen Code (in Python 2.5). Dies war bei weitem der einfachste Weg, den ich gefunden habe, um das zu tun, was Sie verlangen.
Das
ctypes
Material verfügt über alle Typen - C-Datentypen (int
,char
,short
,void*
, und so weiter) , und durch den Wert oder Bezug passieren kann. Es kann auch bestimmte Datentypen zurückgeben, obwohl mein Beispiel dies nicht tut (die HLL-API gibt Werte zurück, indem eine als Referenz übergebene Variable geändert wird).In Bezug auf das oben gezeigte spezifische Beispiel ist die EHLLAPI von IBM eine ziemlich konsistente Schnittstelle.
Alle Aufrufe übergeben vier ungültige Zeiger (EHLLAPI sendet den Rückkehrcode über den vierten Parameter zurück, einen Zeiger auf einen
int
so, während ichint
als Rückgabetyp spezifiziere , kann ich ihn sicher ignorieren) gemäß der Dokumentation von IBM hier . Mit anderen Worten wäre die C-Variante der Funktion:Dies führt zu einer einzigen, einfachen
ctypes
Funktion, die alles kann, was die EHLLAPI-Bibliothek bietet. Es ist jedoch wahrscheinlich, dass andere Bibliotheken eine separatectypes
Funktion benötigen , die pro Bibliotheksfunktion eingerichtet wird.Der Rückgabewert von
WINFUNCTYPE
ist ein Funktionsprototyp, Sie müssen jedoch noch weitere Parameterinformationen einrichten (über die Typen hinaus). Jedes Tupel inhllApiParams
hat einen Parameter "Richtung" (1 = Eingabe, 2 = Ausgabe usw.), einen Parameternamen und einen Standardwert -ctypes
Einzelheiten finden Sie im DokumentSobald Sie die Prototyp- und Parameterinformationen haben, können Sie einen Python "aufrufbar" erstellen,
hllApi
mit dem Sie die Funktion aufrufen können. Sie legen einfach die benötigte Variable (p1
durchp4
in meinem Fall) und mit ihnen die Funktion aufrufen.quelle
hllApiParams
das? Was ist der Sinn dieser Tupel? Es ist schwierig, einige der Dinge in diesem Beispiel mit der Dokumentation abzugleichen.Diese Seite enthält ein sehr einfaches Beispiel für das Aufrufen von Funktionen aus einer DLL-Datei.
Der Vollständigkeit halber die Details hier umschreiben:
quelle
ctypes kann verwendet werden, um auf DLLs zuzugreifen. Hier ist ein Tutorial:
http://docs.python.org/library/ctypes.html#module-ctypes
quelle
Vielleicht mit
Dispatch
:Wo zkemkeeper eine registrierte DLL-Datei auf dem System ist ... Danach können Sie auf Funktionen zugreifen, indem Sie sie einfach aufrufen:
quelle
Erstellen einer DLL und Verknüpfen unter Python mit ctypes
Ich stelle ein voll gearbeitet Beispiel dafür, wie ein Gebäude
shared library
und deren Verwendung unterPython
mittelsctypes
. Ich betrachte denWindows
Fall und beschäftige mich damitDLLs
. Es sind zwei Schritte erforderlich:Die gemeinsam genutzte Bibliothek
Das, was
shared library
ich betrachte, ist das Folgende und ist in dertestDLL.cpp
Datei enthalten. Die einzige FunktiontestDLL
empfängt nur eineint
und druckt sie aus.Erstellen der DLL über die Befehlszeile
Um ein
DLL
WithVisual Studio
über die Befehlszeile zu erstellen , führen Sie es ausum den Include-Pfad festzulegen und dann auszuführen
um die DLL zu erstellen.
Erstellen der
DLL
aus der IDEAlternativ
DLL
kann dasVisual Studio
wie folgt erstellt werden:Verknüpfen der DLL unter Python
Gehen Sie unter Python wie folgt vor
quelle
ctypes ist am einfachsten zu verwenden, aber wenn Sie es (falsch) verwenden, kann Python abstürzen. Wenn Sie versuchen, schnell etwas zu tun, und Sie vorsichtig sind, ist es großartig.
Ich würde Sie ermutigen, sich Boost Python anzuschauen . Ja, es erfordert, dass Sie C ++ - Code schreiben und einen C ++ - Compiler haben, aber Sie müssen C ++ nicht wirklich lernen, um ihn zu verwenden, und Sie können einen kostenlosen (wie in Bier) C ++ - Compiler von Microsoft erhalten .
quelle
Wenn die DLL vom Typ COM-Bibliothek ist, können Sie Pythonnet verwenden.
Versuchen Sie dann in Ihrem Python-Code Folgendes
Instanziieren Sie dann ein Objekt gemäß der Klasse in der DLL und greifen Sie auf die darin enthaltenen Methoden zu.
quelle