私はC ++オブジェクトを持っており、PythonがC ++とPythonの両方に表示される変更を加えることができるように、参照/ポインターによって埋め込まれたPythonインタープリターに渡したいと考えています。相互運用にBoost.Pythonを使用しています。
例として、クラスFoo
、そのBoost.Pythonラッパー、およびFoo
C ++のオブジェクトを次に示します。
mymodule.h:
struct Foo
{
int bar;
Foo(int num): bar(num) {}
};
mymodule.cpp:
#include "mymodule.h"
#include <boost/python.hpp>
BOOST_PYTHON_MODULE(mymodule)
{
using namespace boost::python;
class_<Foo>("Foo", init<int>())
.def_readwrite("bar", &Foo::bar)
;
}
main.cpp:
#include <iostream>
#include <boost/python.hpp>
#include "mymodule.h"
using namespace boost::python;
int main()
{
Py_Initialize();
object main_module = import("__main__");
object main_namespace = main_module.attr("__dict__");
import("mymodule");
Foo foo(42);
// ... somehow use Boost.Python to send reference to interpreter ...
object result = exec_file("myscript.py", main_namespace);
std::cout << foo.bar << std::endl;
}
ではfoo
、C ++とPythonの両方がその内容を確認できるように、Pythonへの参照を送信するにはどうすればよいですか?
C ++では、スクリプトを実行する前に、次を追加します。
main_namespace["foo"] = ptr(&foo);
これで、Python環境にはC ++変数へのポインターがありfoo
、Pythonスクリプトによって変数に加えられた変更は、コピーではなくC ++オブジェクトで実行されます。
の場合myscript.py
:
foo.bar = 12
その場合、cout
最後の行の出力は、12
ではなくになり42
ます。
名前空間foo
内に配置して、mymodule
その起源を自己文書化することをお勧めしますmymodule.foo.bar
。
Boost.Pythonのドキュメントでは、このパスバイポインターの方法については説明されていないようですが、それでも機能します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加