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)
还有一个问题,两种语言互相调用的时候,需要做数据结构(如基本类型,字符串,整数类型等,以及自定义的类等类型)间的转换,共享内存中的一个对象。比如,如何将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)
相关文章推荐
- C++调用python配置及编译出现的问题
- 如何让python调用C和C++代码
- C++调用python脚本
- python调用C++
- 使用C++调用Python脚本的步骤和问题解决办法
- python中调用C++写的动态库
- python中调用C++写的动态库
- C++中调用python函数
- python嵌入C++------ boost.python如何在C++中调用含有不定长参数tuple变量和关键字参数dict变量的函数
- C++ 调用python脚本,无需解释器
- python 调用C++模块 visual studio版
- c/c++调用python(2)
- linux下使用swig让python调用C++(复杂版:包括多文件调用和链接库)
- C++多线程调用Python多进程
- 使用GDB调试python调用的C++共享库
- python中调用C++写的动态库
- c++调用python(复杂版)
- c++调用python封装接口
- Linux使用Python调用C/C++接口
- c++调用python返回值