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

  1. Pass etwas auf die boost::python::exec_file Methode
  2. Mit der boost_indexing_suite_ext
  3. 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?

InformationsquelleAutor devin | 2009-12-20
Schreibe einen Kommentar