我正在寻找一种将C ++类实例公开给python嵌入式解释器的简单方法。
我想将Foo的C ++世界实例公开给python世界(并视为Foo类)。
如果可能,这可能吗?
我认为这几乎与第一个答案一样: boost :: python :: ptr或PyInstance_New用法
我想这意味着我应该使用boost.Python包装我的图书馆?
boost.Python
我唯一的目标是在嵌入式python解释器中操作Foo的C ++实例(不确定是否可以使用先前的方法来完成)。
希望我很清楚,谢谢您的帮助。
更新
感谢您的回答。实际上,我已经将我的Foo类暴露给了python(带有swig)。
是)我有的:
我的Foo班:
class Foo{...};
我的包装库(包括Foo类)暴露给了python: 因此我可以启动python解释器并执行以下操作:
import my_module foo=my_modulde.Foo()
我想要的是:
具有一个C 主程序,该程序嵌入了python解释器并处理C 世界变量。
int main(int argc, char **argv) { Foo foo; // instanciates foo Py_Initialize(); Py_Main(argc, argv); // starts the python interpreter // and manipulates THE foo instance in it Py_Finalize(); return 0; }
现在更清晰?:)
Boost python允许您以非常紧密的集成方式将c 类公开给python-您甚至可以包装它们,以便可以从c 类派生python类,并将虚拟方法解析为python覆盖。
该升压蟒蛇教程是一个良好的开端。
编辑:
You can create a c++ object and pass a reference to it to an internal python interpreter like this:
#include <boost/shared_ptr.hpp> #include <boost/make_shared.hpp> #include <boost/python.hpp> #include <string> #include <iostream> namespace bp = boost::python; struct Foo{ Foo(){} Foo(std::string const& s) : m_string(s){} void doSomething() { std::cout << "Foo:" << m_string << std::endl; } std::string m_string; }; typedef boost::shared_ptr<Foo> foo_ptr; BOOST_PYTHON_MODULE(hello) { bp::class_<Foo, foo_ptr>("Foo") .def("doSomething", &Foo::doSomething) ; }; int main(int argc, char **argv) { Py_Initialize(); try { PyRun_SimpleString( "a_foo = None\n" "\n" "def setup(a_foo_from_cxx):\n" " print 'setup called with', a_foo_from_cxx\n" " global a_foo\n" " a_foo = a_foo_from_cxx\n" "\n" "def run():\n" " a_foo.doSomething()\n" "\n" "print 'main module loaded'\n" ); foo_ptr a_cxx_foo = boost::make_shared<Foo>("c++"); inithello(); bp::object main = bp::object(bp::handle<>(bp::borrowed( PyImport_AddModule("__main__") ))); // pass the reference to a_cxx_foo into python: bp::object setup_func = main.attr("setup"); setup_func(a_cxx_foo); // now run the python 'main' function bp::object run_func = main.attr("run"); run_func(); } catch (bp::error_already_set) { PyErr_Print(); } Py_Finalize(); return 0; }