您的位置:首页 > 编程语言 > C语言/C++

C++调用Python(4)

2008-09-22 16:01 453 查看
其实,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的脚本中调用其函数。
#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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: