Ich versuche derzeit, Python 3.6-Ctypes-Modul zum Aufrufen von Funktionen aus einer Bibliothek in C++ geschrieben.Verwenden von Pythons Ctypes zum Aufrufen von Funktionen mit benutzerdefinierten Typen
Angenommen habe ich ctypes ein Objekt gemeinsam genutzte Bibliothek erstellen genannt mylibrary:
# Python code
myLibrary = ctypes.CDLL(mylib.dylib)
Die Bibliothek Ich versuche, Anrufe zu tätigen, aus verwendet C++ Klassen, und es ist unmöglich, mit ctypes Python Anrufe von dem machen Formular myLibrary.class()->method()
(siehe here).
Ich schreibe daher zuerst einige Zwischen-C++ - Code, der die C++ - Klassenmethoden in einer Nicht-Klassenform "umschließt". Angenommen, Math
ist eine der Klassen und Add()
ist eine der Methoden. Meine Zwischen Wrapper würde wie folgt aussehen:
// C++ intermediate code
int Add(int num1, int num2){ // no reference to a class
return Math()->Add(num1, num2); // reference to a class
}
Ich plane, dann auf der Erstellung dieses C++ in einer gemeinsam genutzten Bibliothek (eine dylib Datei), auf dem ich Anrufe in Python ctypes mit machen kann. Zum Beispiel:
# Python code
def add(num1, num2):
myLibrary.add(num1, num2)
Das ist der Plan.
Leider haben viele Methoden in der Bibliothek exotische Argument- und Werttypen. Einige sind einfach Variantennamen, die mit dem Schlüsselwort typedef
erstellt wurden, aber andere sind exotische Strukturen. Außerdem gibt es ein wenig Aufzählung im ursprünglichen C++ - Code.
Meine Frage ist: Wie behandelt man benutzerdefinierte Argument und Werttypen (und Enumeration) bei der Verwendung von Ctypes?
Mit Blick auf die ctypes documentation, ich weiß, dass Sie restypes und argTypes für die Methoden angeben müssen Sie zu nennen sind versuchen, aber wie dies zu tun, wenn das Original C++ Funktionen exotischen Arten und Strukturen beinhalten?
Ich dachte, die Ctypes-Dokumentation könnte dies in Abschnitt 15.17.1.6 beleuchten. ("Funktionen mit eigenen benutzerdefinierten Datentypen aufrufen"), aber es handelt sich nur um das umgekehrte Szenario, in dem Sie Ihre eigenen Objekttypen an die C++ - Funktionen übergeben möchten.
ähnliche Fragen, die hilfreich waren, aber nicht völlig:
- How to use C++ classes with ctypes?
- Obtaining address of custom data-type in C from Python using ctypes