Ich möchte die folgende C ++ - Funktion für Python mit Boost.Python verfügbar machen:
%Vor%Wenn ich versuche, diese Bibliothek zu kompilieren, tritt der Fehler auf (es ist meine Vermutung) Boost.Python weiß nicht, wie man int * in PyObject umwandelt.
Ich denke, was getan werden muss, ist die Konversionsstruktur, etwa so:
%Vor%Und übergeben Sie es an die BOOST_PYTHON_MODULE-Deklaration:
%Vor%Aber es funktioniert auch nicht. Und ich kann keine Informationen darüber finden, wie die Funktionen behandelt werden, die Zeiger zurückgeben.
Kann jemand helfen?
Kurz gesagt, kann man eine Funktion, die int*
mit Boost.Python zurückgibt, nicht direkt verfügbar machen, da es in Python keine sinnvollen entsprechenden Typen gibt, da ganze Zahlen unveränderlich sind.
int
nach Wert zurück. Dies kann die Verwendung einer Hilfsfunktion erfordern, um ältere APIs anzupassen. Anstatt die endgültige Lösung sofort zu präsentieren, möchte ich mir die Zeit nehmen, die Compiler-Fehler durchzugehen. Mit Boost.Python werden manchmal statische statische C ++ 11-Assertionen verwendet, um Anweisungen in den Compiler-Nachrichten bereitzustellen. Leider kann es schwierig sein, sie unter den schweren Vorlagen zu finden.
Der folgende Code:
%Vor%erzeugt die folgende relevante Ausgabe in clang, wobei die wichtigen Details fett hervorgehoben sind:
%Vor% Boost.Python teilt uns mit, dass eine boost::python::return_value_policy
angegeben werden muss für Funktionen, die int*
zurückgeben. Es gibt verschiedene Modelle von ResultConverterGenerators . Häufig werden die Richtlinien verwendet, um die Besitz- oder Lebensdauer-Semantik des zurückgegebenen Objekts zu steuern. Da die Funktion im ursprünglichen Code einen neuen Zeiger direkt an Python zurückgibt, wird boost::python::manage_new_object
ist angebracht, wenn der Aufrufer die Verantwortung für das Löschen des Objekts übernehmen soll.
Die Angabe einer Richtlinie für die Objektverwaltung schlägt weiterhin fehl:
%Vor%erzeugt die folgende relevante Ausgabe:
%Vor% In diesem Fall informiert uns Boost.Python darüber, dass das Objekt, das von einer Funktion mit einem managed_new_object
ResultConverterGenerator zurückgegeben wird, entweder ein class
oder union
sein muss. Für int*
ist die am besten geeignete Lösung, den Wert int
nach Wert zurückzugeben, wenn Sie den Boost.Python-Layer durchlaufen. Der Vollständigkeit halber zeigt jedoch Folgendes:
Interaktive Verwendung:
%Vor%Tags und Links python c++ boost boost-python