其实,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的脚本中调用其函数。
系列文章:
Python调用C/C++函数(1)
Python调用采用Boost Python封装的c++(2)
C++调用Python(3)
C++调用Python(4)
c++和Python互操作高级应用(5)
还有一个问题,两种语言互相调用的时候,需要做数据结构(如基本类型,字符串,整数类型等,以及自定义的类等类型)间的转换,共享内存中的一个对象。比如,如何将C++的对象实例传入python中,并在python中使用。c++和python并不在一个进程中,因此可以使用boost的shared_ptr来实现。
下面这个例子,主要是演示了,c++调用python,可以在c++中形成一个python脚本,然后利用PyRun_SimpleString调用;并且,构造一个c++的对象,传入到python中,并在python的脚本中调用其函数。
- #include <boost/python.hpp>
- #include <iostream>
- using namespace boost::python;
- class World
- {
- public:
- void set(std::string msg) { this->msg = msg; }
- std::string greet() { return msg; }
- std::string msg;
- };
- typedef boost::shared_ptr < World > world_ptr;
- BOOST_PYTHON_MODULE(hello)
- {
- class_ <World>("World")
- .def("greet", &World::greet)
- .def("set", &World::set)
- ;
- register_ptr_to_python <world_ptr>();
- }
- int main(int argc, char *argv[])
- {
- Py_Initialize();
- world_ptr worldObjectPtr (new World);
- worldObjectPtr->set("Hello from C++!");
- try
- {
- inithello();
- PyRun_SimpleString("import hello");
- object module(handle <>(borrowed(PyImport_AddModule("__main__"))));
- object dictionary = module.attr("__dict__");
- dictionary["pyWorldObjectPtr"] = worldObjectPtr;
- PyRun_SimpleString("pyWorldObjectPtr.set('Hello from Python!')");
- }
- catch (error_already_set)
- {
- PyErr_Print();
- }
- std::cout << "worldObjectPtr->greet(): " << worldObjectPtr->greet() <<std::endl;
- Py_Finalize();
- return 0;
- }
Python调用C/C++函数(1)
Python调用采用Boost Python封装的c++(2)
C++调用Python(3)
C++调用Python(4)
c++和Python互操作高级应用(5)