C++调用Python(4)

来源:互联网 发布:it接单平台 编辑:程序博客网 时间:2024/06/14 00:15
其实,C++调用Python有两种方式,我前面介绍了第一种方式:通过找到Python模块,类,方法,构造参数来调用。第二中方式,就是通过构造出一个Python的脚本,用python引擎来执行。第一种方式可能更为优雅,符合大多数的反射调用的特点。(我在以前的一个项目中,实现了c#的反射机制,c#调用Com+,c#调用javascript脚本等)。
  还有一个问题,两种语言互相调用的时候,需要做数据结构(如基本类型,字符串,整数类型等,以及自定义的类等类型)间的转换,共享内存中的一个对象。比如,如何将C++的对象实例传入python中,并在python中使用。c++和python并不在一个进程中,因此可以使用boost的shared_ptr来实现。
   下面这个例子,主要是演示了,c++调用python,可以在c++中形成一个python脚本,然后利用PyRun_SimpleString调用;并且,构造一个c++的对象,传入到python中,并在python的脚本中调用其函数。
  1. #include <boost/python.hpp>
  2. #include <iostream>
  3. using namespace boost::python;
  4. class World
  5. {
  6. public:
  7.       void set(std::string msg) { this->msg = msg; }
  8.       std::string greet() { return msg; }
  9.       std::string msg;
  10. };
  11. typedef boost::shared_ptr < World > world_ptr;
  12. BOOST_PYTHON_MODULE(hello)
  13. {
  14.       class_ <World>("World")
  15.           .def("greet", &World::greet)
  16.           .def("set", &World::set)
  17.       ;
  18.       register_ptr_to_python <world_ptr>();
  19. }
  20. int main(int argc, char *argv[])
  21. {
  22.     
  23.     Py_Initialize();
  24.     world_ptr worldObjectPtr (new World);
  25.     worldObjectPtr->set("Hello from C++!");
  26.     try 
  27.     {        
  28.         inithello();
  29.         PyRun_SimpleString("import hello");
  30.         
  31.         object module(handle <>(borrowed(PyImport_AddModule("__main__"))));
  32.         object dictionary = module.attr("__dict__");
  33.         dictionary["pyWorldObjectPtr"] = worldObjectPtr;
  34.         PyRun_SimpleString("pyWorldObjectPtr.set('Hello from Python!')");
  35.     } 
  36.     catch (error_already_set) 
  37.     {
  38.         PyErr_Print();
  39.     }
  40.     std::cout << "worldObjectPtr->greet(): " << worldObjectPtr->greet() <<std::endl;
  41.     Py_Finalize();
  42.     return 0;
  43. }
转自:http://blog.csdn.net/marising/article/details/2962322