c++和Python互操作高级应用(5)
来源:互联网 发布:it接单平台 编辑:程序博客网 时间:2024/06/07 03:50
把我在实际过程中遇到的问题,总结一下,请先阅读:python教程,python FAQ
1.如果封装的c++类没有拷贝构造函数怎么办?
定义class的时候,加入模板参数boost::noncopyable,同时指定no_init
- class_<ExpandEmitter,boost::noncopyable>("ExpandEmitter",no_init);
拷贝构造的目的是,c++对象实例传递给python时,可以通过拷贝构造重新构造一个python中使用的对象实例。一般如果没有拷贝构造,需要boost的share_ptr来传递共享指针。
2.封装的c++函数如何返回指针或者引用?
return_value_policy<return_by_reference>(),返回值策略设置为return_by_reference即可
- .def("getPostData",&Request::getPostData,return_value_policy<return_by_reference>())
3.自定义的String怎么和python进行自动转换?
http://www.maycode.com/boostdoc/boost-doc/libs/python/doc/v2/faq.html#custom_string
- struct template_string_to_python_str
- {
- static PyObject* convert(TemplateString const& s)
- {
- return boost::python::incref(boost::python::object(s.ptr()).ptr());
- }
- };
- struct template_string_from_python_str
- {
- template_string_from_python_str()
- {
- boost::python::converter::registry::push_back(
- &convertible,
- &construct,
- boost::python::type_id<TemplateString>());
- }
- static void* convertible(PyObject* obj_ptr)
- {
- if (!PyString_Check(obj_ptr))
- {
- return 0;
- }
- return obj_ptr;
- }
- static void construct(
- PyObject* obj_ptr, boost::python::converter::rvalue_from_python_stage1_data* data)
- {
- const char* value = PyString_AsString(obj_ptr);
- if (value == 0)
- boost::python::throw_error_already_set();
- void* storage = (
- (boost::python::converter::rvalue_from_python_storage<TemplateString>*)
- data)->storage.bytes;
- new (storage) TemplateString(value);
- data->convertible = storage;
- }
- };
- BOOST_PYTHON_MODULE(ctemplate)
- {
- boost::python::to_python_converter<
- TemplateString,
- template_string_to_python_str>();
- template_string_from_python_str();
- }
4.对象释放的问题
假如在c++中创建的对象,在python中怎么释放?或者在python中创建的对象,在c++怎么释放?
我的看法是,在一种语言中创建并释放。如果你想在python中创建对象,可以调用c++的函数,比如newClass()来创建,返回一个指针或者引用,使用完毕,调用c++的deleteClass()来释放。否则,python引用计数会特别麻烦,很容易导致内存泄漏等问题。
5.共享指针,怎么手工释放?
共享指针,默认是自动释放的,但是有时候,我们并不需要自动释放,想自己手工释放,可以定义一个释放函数,在创建共享指针的时候,传入释放函数指针。
- //定义
- typedef boost::shared_ptr < World > world_ptr;
- //定义一个释放函数
- void deleteWorld(World* w);
- //共享指针,传入释放函数指针
- world_ptr worldObjectPtr (new World,deleteWorld);
6.c++封装模块,多个文件include,怎么会有多重定义的问题?
- BOOST_PYTHON_MODULE(hello)
- {
- class_ <World>("World")
- .def("greet", &World::greet)
- .def("set", &World::set)
- ;
- register_ptr_to_python <world_ptr>();
- }
如果上面这段在.h文件中,多个cpp文件引用是不行的。这个时候,可以定义一个头文件如下
- extern "C" void inithello();
你在头文件中首先声明inithello(),在把上面的移到cpp中,BOOST_PYTHON_MODULE会实现一个函数inithello(),这样就可以了。
7.如何封装c++容器?
boost/python/suite/indexing目录下的头文件
- //include
- #include <boost/python/suite/indexing/map_indexing_suite.hpp>
- //定义模块时,可以定义map
- //String map
- boost::python::class_<std::map<std::String,std::String> >("StrMap")
- .def(map_indexing_suite<std::map<std::String,std::String> >())
本人研究过一段时间并在实际项目中应用,写出这个系列希望对大家有帮助。
转自:http://blog.csdn.net/marising/article/details/2962560
- c++和Python互操作高级应用(5)
- c++和Python互操作高级应用(5)
- c++和Python互操作高级应用
- C语言高级应用---操作linux下V4L2摄像头应用程序
- python的高级应用
- python操作mysql数据库(高级教程)
- C语言高级应用
- c语言---文件的操作和应用(1)
- C语言位运算的高级应用(尤其适合单片机和嵌入式编程)
- C语言复杂表达式和指针高级应用
- 4.4.C语言复杂表达式和指针高级应用
- C语言中cin和cout高级格式化操作
- Windows中使用Python和C/C++联合开发应用程序起步(Python/C API应用)
- python高级应用-twisted框架
- Python变量的高级应用
- 第十四章 兼容性和高级互操作
- python- shutil 高级文件操作
- python- shutil 高级文件操作
- C++调用Python(4)
- 5个最佳的3D游戏开发工具
- 【教程连载】ArcGIS for iOS 开发系列(3) – 基础篇-“Hello World Map”
- NSMutableArray中存放struct变量的方法
- SQL2000的系统表sysproperties在SQL2005中 无效的问题
- c++和Python互操作高级应用(5)
- An association from the table B_USER refers to an unmapped class: com.shxt.framework.book.bo.Dict
- 资料分享:2012台湾骇客年会(HITCON 2012)大会演讲PPT
- SQL脚本
- 【教程连载】ArcGIS for iOS 开发系列(2) – 开发环境配置
- 小儿发烧感冒,尽可能多护理,多观察,不要随便用药
- svn学习日志
- 【教程连载】ArcGIS for iOS 开发系列(1) – 基本概念
- 敬体、简体和「である」都何时用