栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何在不构建模块的情况下向Python公开C ++类

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何在不构建模块的情况下向Python公开C ++类

我找到了答案。实际上,我正在搜索的内容与此答案非常相似(感谢moooeeeep的评论):

将C
++类实例暴露给python嵌入式解释器

遵循C ++类(注意!默认构造函数是必需的):

class TwoValues{public:    TwoValues(void): iValue1(0), iValue2(0) {}    TwoValues(int iValue1, int iValue2): iValue1(iValue1_), iValue2(iValue2_) {}    int Addition(void) const {if (!this) return 0; return iValue1 + iValue2;}public:    int iValue1;    int iValue2;};

可以通过以下宏通过增强来暴露:

BOOST_PYTHON_MODULE(ModuleTestBoost){class_<TwoValues>("TwoValues")   .def("Addition",  &TWOVALUES::Addition)   .add_property("Value1",      &TWOVALUES::iValue1)   .add_property("Value2",      &TWOVALUES::iValue2);};

另一方面,我定义了一个python函数,

python_script.py
该函数接受此类的实例并执行某些操作。例如:

def wrapper_function(instance):    result = instance.Addition()    myfile = open(r"C:...testboostexample.txt", "w")    output = 'First variable is {0}, second variable is {1} and finally the addition is {2}'.format(instance.Value1, instance.Value2, result)    myfile .write(output)    myfile .close()

然后在C ++端,我可以通过同时发送类的实例来调用此函数,如下所示:

Py_Initialize();try    {    TwoValues instance(5, 10);    initModuleTestBoost();    object python_script = import("python_script");    object wrapper_function = python_script.attr("wrapper_function");    wrapper_function(&instance);    }catch (error_already_set)    {    PyErr_Print();    }Py_Finalize();

优点:

  • 我不需要建立任何共享库或二进制文件
  • 当我使用Boost时,我不必担心内存管理和引用计数
  • 我不使用共享的升压指针(boost :: shared_ptr)指向类的实例


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/429283.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号