2017-12-09 4 views
0

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:

Antwort

2

Beachten Sie, dass der ctypes ausgelegt ist C Code aufzurufen, nicht C++.

Da Sie bereits Wrapper zu schreiben, müssen Sie nur eine Sache ändern - angeben, dass diese Wrapper-Funktionen C Verknüpfung haben:

// C++ intermediate code 
extern "C" int Add(int num1, int num2) { // no reference to a class 
    return Math()->Add(num1, num2);   // reference to a class 
} 

Was die Strukturen und so weiter, sollten Sie eine Definition richtige C Sprachschnittstelle für diese. Es wird nicht schwierig sein, mit dem ctypes Wrapper dafür zu kommen.

Verwandte Themen