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 を使用しているのを見てきました。
この例も見つけましたが、紛らわしいことがわかりました。
いくつかのアプローチを考えることができます
boost::python::exec_file
メソッドに何かを渡す- を使用して
boost_indexing_suite_ext
- ウイング
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 は非常に一般的であるため、これを行うための定義済みの方法が必要です...そうですか?