4

std::vector を生成する C++ コードをいくつか書きました。

また、いくつかのデータを操作する python スクリプトもあります。今のところ、このように宣言しています (以下)。

import numpy
x = numpy.random.randn(1000)
y = numpy.random.randn(1000)

スクリプトを正常に実行できます。私のC++コードから:

    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;

C++ データを Python に渡す方法がわかりません。いろいろ調べましたが、決定的なものはないようです。

私は私のC ++に持っています

BOOST_PYTHON_MODULE(vector_indexing_suite_ext){
        boost::python::class_<std::vector<double> >("PyVec")
        .def(boost::python::vector_indexing_suite<std::vector<double> >());
}

これは機能しているようですが、私が理解しているように、Pythonスクリプト用のクラス「PyVec」のみを提供し、必要なデータは提供しません。私が間違っている?

また、他の人が Python メーリング リストで boost::shared_ptr を使用しているのを見てきました。

この例も見つけましたが、紛らわしいことがわかりました。

いくつかのアプローチを考えることができます

  1. boost::python::exec_fileメソッドに何かを渡す
  2. を使用してboost_indexing_suite_ext
  3. ウイングboost::shared_ptr

どのアプローチが最も簡単に実行できますか? 私には明確なアプローチはないようです。

ここに私が見たいくつかのリンクがあります: boostウェブサイト から pythonウェブサイトから 別のメーリングリストスレッド

アップデート:

intこれは、以下のような私のpythonコードに渡すために機能します

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;
}

しかし、ベクトルを渡したいのですが、上記と同様の方法でそれを行おうとすると、このエラーが発生します

TypeError: C++ 型の to_python (値渡し) コンバーターが見つかりません: std::vector >

したがって、明らかに、std::vector の処理方法を Python に伝える必要があります。このコードはそれを助けることができると思います。

BOOST_PYTHON_MODULE(vector_indexing_suite_ext){
        boost::python::class_<std::vector<double> >("PyVec")
        .def(boost::python::vector_indexing_suite<std::vector<double> >());
}

しかし、std::vector は非常に一般的であるため、これを行うための定義済みの方法が必要です...そうですか?

4

2 に答える 2

12

次のコードは私にとってはうまくいきます(Python 2.6、Boost 1.39)。BOOST_PYTHON_MODULEこれは、行自体がない (ただしclass_、ベクトルの定義がある)ことを除いて、コードとほとんど同じです。BOOST_PYTHON_MODULE拡張モジュールを作成するときにのみ使用する必要があります。

#include <iostream>
#include <boost/python.hpp>
#include <boost/python/suite/indexing/vector_indexing_suite.hpp>
using namespace boost::python;
using namespace std;

int main()
{
    vector<double> vec;
    vec.push_back(1.2);
    vec.push_back(3.4);
    try {   
            Py_Initialize();

            boost::python::class_<std::vector<double> >("PyVec")
            .def(boost::python::vector_indexing_suite<std::vector<double> >());

            object main_module = import("__main__");
            object globals = main_module.attr("__dict__");
            globals["var"]=vec;
            object ignored = exec("result = sum(var)", globals, globals);
            double result = extract<double>(globals["result"]);
            std::cout << result << std::endl;
    } catch( error_already_set ) {
            PyErr_Print();
    }
    return 0;
}
于 2010-01-11T20:55:54.230 に答える
3

正しく理解しているかどうかはわかりません。を保持できるクラス「PyVec」をエクスポートした後、std::vector<double>ベクトルを入力または戻り値の型として取る任意の c++ 関数をエクスポートできます。したがって、もちろん、C++ 内でベクトルを設定し、Python でインターフェイス型 "PyVec" を使用してこのデータにアクセスできます。

于 2009-12-21T09:08:40.537 に答える