c++和Python互操作高级应用(5)

把我在实际过程中遇到的问题,总结一下,请先阅读:python教程python FAQ

1.如果封装的c++类没有拷贝构造函数怎么办?
定义class的时候,加入模板参数boost::noncopyable,同时指定no_init

  1.  class_<ExpandEmitter,boost::noncopyable>("ExpandEmitter",no_init);

拷贝构造的目的是,c++对象实例传递给python时,可以通过拷贝构造重新构造一个python中使用的对象实例。一般如果没有拷贝构造,需要boost的share_ptr来传递共享指针。

2.封装的c++函数如何返回指针或者引用?
return_value_policy<return_by_reference>(),返回值策略设置为return_by_reference即可

  1.  .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

 


4.对象释放的问题
假如在c++中创建的对象,在python中怎么释放?或者在python中创建的对象,在c++怎么释放?
我的看法是,在一种语言中创建并释放。如果你想在python中创建对象,可以调用c++的函数,比如newClass()来创建,返回一个指针或者引用,使用完毕,调用c++的deleteClass()来释放。否则,python引用计数会特别麻烦,很容易导致内存泄漏等问题。

5.共享指针,怎么手工释放?
共享指针,默认是自动释放的,但是有时候,我们并不需要自动释放,想自己手工释放,可以定义一个释放函数,在创建共享指针的时候,传入释放函数指针。

  1. //定义
  2. typedef boost::shared_ptr < World > world_ptr;
  3. //定义一个释放函数
  4. void deleteWorld(World* w);
  5. //共享指针,传入释放函数指针
  6. world_ptr worldObjectPtr (new World,deleteWorld);

6.c++封装模块,多个文件include,怎么会有多重定义的问题?

  1. BOOST_PYTHON_MODULE(hello)
  2. {
  3.       class_ <World>("World")
  4.           .def("greet", &World::greet)
  5.           .def("set", &World::set)
  6.       ;
  7.       register_ptr_to_python <world_ptr>();
  8. }

如果上面这段在.h文件中,多个cpp文件引用是不行的。这个时候,可以定义一个头文件如下

  1. extern "C" void inithello();

你在头文件中首先声明inithello(),在把上面的移到cpp中,BOOST_PYTHON_MODULE会实现一个函数inithello(),这样就可以了。

7.如何封装c++容器?
boost/python/suite/indexing目录下的头文件

  1. //include
  2. #include <boost/python/suite/indexing/map_indexing_suite.hpp>
  3. //定义模块时,可以定义map
  4.    //String map
  5.     boost::python::class_<std::map<std::String,std::String> >("StrMap")
  6.         .def(map_indexing_suite<std::map<std::String,std::String> >())


本人研究过一段时间并在实际项目中应用,写出这个系列希望对大家有帮助。
系列文章:
Python调用C/C++函数(1)
Python调用采用Boost Python封装的c++(2)
C++调用Python(3)
C++调用Python(4)
c++和Python互操作高级应用(5)

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在protobuf中,可以使用不同语言编写的代码进行相互传递。对于PythonC++之间的相互传递,可以按照以下步骤进行操作: 1. 首先,我们需要使用protobuf协议来定义消息格式。可以使用.proto文件来定义消息结构。 2. 使用protobuf编译器(protoc)将.proto文件编译为对应语言的代码文件。对于Python,可以使用protobuf的python版本来编译。 可以按照中的方法,在protobuf-2.5.0\python目录下运行以下命令编译proto文件: ``` protoc -I=<proto文件所在目录> --python_out=<输出目录> <proto文件名>.proto ``` 这将生成一个.py文件,其中包含生成的Python代码。 3. 对于Python中的编译好的代码文件,可以直接在Python代码中导入并使用。 在Python代码中,需要使用`import`语句导入生成的.py文件,然后使用生成的类来创建和操作消息。 4. 对于C++中的编译好的代码文件,可以按照中的方法进行编译。 首先,确保已经安装了protobuf库。然后,在命令行中使用g++编译器将.proto文件和生成的代码文件进行编译。 ``` g++ -o <输出文件名> <proto文件名>.pb.cc <生成的代码文件名>.cpp -lprotobuf ``` 这将生成一个可执行文件,可以在C++中使用。 5. 在PythonC++之间进行相互传递时,可以使用protobuf提供的序列化和反序列化方法。在Python中,可以使用protobuf生成的类的`SerializeToString()`方法将消息序列化为字符串;在C++中,可以使用protobuf提供的方法将消息序列化为字节流。 在Python中,可以使用protobuf生成的类的`ParseFromString()`方法将接收到的字节流反序列化为消息对象;在C++中,可以使用protobuf提供的方法将接收到的字节流反序列化为消息对象。 这样,就实现了PythonC++之间的protobuf消息的互传。 需要注意的是,在使用protobuf过程中,大小写转换问题可能会导致一些错误。如所提到的,默认情况下,protoc会将变量的大小写转换为小写字母。在Python中,变量是区分大小写的。因此,在处理大小写问题时需要注意避免出错。 综上所述,即可实现PythonC++之间的protobuf消息互传。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值