Verfügbarmachen von std::vector<double> mit boost.python
Ich geschrieben habe, etwas C++ - code erzeugt, dass ein std::vector.
Ich habe auch ein python-Skript manipuliert einige Daten, die, für jetzt, sage ich, wie hier (unten).
import numpy
x = numpy.random.randn(1000)
y = numpy.random.randn(1000)
Kann ich das Skript ausführen, in Ordnung. Aus meiner C++ - code:
using namespace boost::python;
try{
Py_Initialize();
object main = import("__main__");
object global(main.attr("__dict__"));
object result = exec_file("scatterPlot.py", global, global);
Py_Finalize();
}
catch(error_already_set){
PyErr_Print();
}
return;
Ich habe keine Ahnung, wie man meine C++ Daten in python. Ich habe, um ganz ein bisschen, aber es scheint nicht zu sein, nichts endgültiges.
Ich habe in meinem C++
BOOST_PYTHON_MODULE(vector_indexing_suite_ext){
boost::python::class_<std::vector<double> >("PyVec")
.def(boost::python::vector_indexing_suite<std::vector<double> >());
}
Diese scheint zu funktionieren, aber so wie ich das verstehe, es bietet nur eine Klasse "PyVec" für mein python-Skript, aber nicht die Daten die ich brauche. Bin ich falsch?
Ich habe auch gesehen, wie einige andere Leute benutzen boost::shared_ptr in einer python-Mailingliste.
Fand ich auch dieses Beispiel, fand es aber verwirrend.
Ich denken kann ein paar Ansätze
- Pass etwas auf die
boost::python::exec_file
Methode - Mit der
boost_indexing_suite_ext
- Uinsg
boost::shared_ptr
Welcher Ansatz ist am einfachsten gehen? Kein Ansatz scheint mir klar.
Hier sind einige weitere links habe ich mir angeschaut:
von der boost-Webseite
von der python-website
ein weiteres mailing-Liste thread
UPDATE:
Diese Werke für die übergabe einer int
zu meinem python-code wie unten
int main(){
int five_squared=0;
int a =3;
try {
Py_Initialize();
object main_module = import("__main__");
object main_namespace = main_module.attr("__dict__");
main_namespace["var"]=a;
object ignored = exec("result = 5 ** var", main_namespace);
five_squared = extract<int>(main_namespace["result"]);
} catch( error_already_set ) {
PyErr_Print();
}
std::cout << five_squared << std::endl;
return 0;
}
Aber ich wollen, eine Vektor, wenn ich versuche zu tun, die in ähnlicher Weise wie oben bekomme ich diesen Fehler
TypeError: Keine to_python (von-Wert)
Konverter gefunden für C++ - Typ:
std::vector >
Also, natürlich muss ich sagen, python, wie man mit std::vector. Ich denke, dass dieser code könnte helfen.
BOOST_PYTHON_MODULE(vector_indexing_suite_ext){
boost::python::class_<std::vector<double> >("PyVec")
.def(boost::python::vector_indexing_suite<std::vector<double> >());
}
Aber da std::vector ist ziemlich üblich, muss es eine definierte Art und Weise, dies zu tun... richtig?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der folgende code funktioniert für mich (Python 2.6, Boost 1.39). Dies ist fast dasselbe wie dein code, außer ohne die
BOOST_PYTHON_MODULE
Linie selbst (aber mit derclass_
definition für den Vektor).BOOST_PYTHON_MODULE
muss nur beim anlegen von extension-Modulen.Ich bin mir nicht sicher, ob ich das richtig verstanden habe. Nach dem Export Ihrer Klasse "PyVec" die halten kann
std::vector<double>
können Sie den export jede c++ - Funktion, die Vektor als Eingabe-oder return-Typ. Also, natürlich, können Sie füllen Sie Ihre vector in c++ und Zugriff auf diese Daten in Python mit den angebundenen Art "PyVec".__setitem__
und__getitem__
, so innerhalb von python können Sie füllen Sie den Vektor mit den subskript-operator []. Haben Sie das Vektor-Beispiel von boost::python Indizierung suite? boost.org/doc/libs/1_41_0/libs/python/test/....cpp
Datei (ersetzen Sie den.py
Erweiterung im link) erhalten Sie ein komplettes Beispiel...