当前位置:  软件>C/C++软件

C++ 嵌入、扩展Python的开发库 ffpython

    来源:    发布时间:2015-02-20

    本文导语:  Python 是最流行的脚本之一,并且python拥有定义良好的C API接口,同时又有丰富的文档,与C++结合非常的适合。通常情况下使用C++封装机制,而用python脚本实现策略或者是控制。使用python和C++结合的技术拥有如下优势:     •...

Python 是最流行的脚本之一,并且python拥有定义良好的C API接口,同时又有丰富的文档,与C++结合非常的适合。通常情况下使用C++封装机制,而用python脚本实现策略或者是控制。使用python和C++结合的技术拥有如下优势:
    •    主体系统使用C++实现,保持系统的高效。
    •    控制部分使用python,增加开发效率,python的内存垃圾回收,丰富的类库都使C++开发者获益匪浅。
    •    Python脚本可以运行期重载,可以实现控制部分不停机热更新。

C++与python的编程范式有很大不同,当使用python C API调用python时,python中的一些特有机制会给C++开发者带来很多困惑。常常使用python C API时需要注意如下几点:
    •    Python 使用引用计数管理内存,调用python C API时对于返回值返回的是借用的引用还是新的引用,需要根据文档仔细确认。否则轻则出现内存泄露,重则程序崩溃。
    •    Python中的数据结构与C++的有很大不同。Python常用的有tuple,list,dict。而c++常用的事 vector,list,map,并且c++是强类型的。当c++与python进行交互时,C++层希望操作python数据结构就像操作c++ STL一样方便,而在python脚本层,又希望c++传入的参数或返回值都是原生的python数据
    •    C++中常用的指针传递对象,当嵌入python时,需要把c++对象传递到python中。

ffpython是专门方便C++嵌入python开发的类库,基于ffpython一方面可以轻松的将python集成到C++系统,另一方面,C++对象或接口也可以很容易被python使用,总之ffpython简化了c++与python的交互操作。
    ffpython 是轻量级的,只有一个头文件,并且增加了一个方便阅读的版本,可以供想要嵌入python的开发者参考。


嵌入python

int a1 = 100; float a2 = 3.14f; string a3 = "OhWell";
ffpython.call("fftest", "test_base", a1, a2, a3);

使用STL

vector a1;a1.push_back(100);a1.push_back(200);
list a2; a2.push_back("Oh");a2.push_back("Nice");
vector a3;a3.push_back(a2);
ffpython.call("fftest", "test_stl", a1, a2, a3);

异常
用户可以catch标准异常,what接口返回的字符串包含了异常的traceback信息方便排查错误。示例如下:

try{
    ......
}
catch(exception& e)
{
    printf("exception traceback %sn", e.what());
}

扩展python
ffpython 可以注册static函数到python中,全局的C风格的static函数和类中定义的static函数都可以被注册到python中,示例如下:

static int print_val(int a1, float a2, const string& a3, const vector& a4)
{
    printf("%s[%d,%f,%s,%d]n", __FUNCTION__, a1, a2, a3.c_str(), a4.size());
    return 0;
}
struct ops_t
{
    static list return_stl()
    {
        list ret;ret.push_back(1024);
        printf("%sn", __FUNCTION__);
        return ret;
    }
};
void test_reg_function()
{
    ffpython_t ffpython;
    ffpython.reg(&print_val, "print_val")
            .reg(&ops_t::return_stl, "return_stl");
    ffpython.init("ext1");
    ffpython.call("fftest", "test_reg_function");
}

c++类注册到python

class foo_t
{
public:
    foo_t(int v_):m_value(v_)
    {
        printf("%sn", __FUNCTION__);
    }
    virtual ~foo_t()
    {
        printf("%sn", __FUNCTION__);
    }
    int get_value() const { return m_value; }
    void set_value(int v_) { m_value = v_; }
    void test_stl(map& v_) 
    {
        printf("%sn", __FUNCTION__);
    }
    int m_value;
};
class dumy_t: public foo_t
{
public:
    dumy_t(int v_):foo_t(v_)
    {
        printf("%sn", __FUNCTION__);
    }
    ~dumy_t()
    {
        printf("%sn", __FUNCTION__);
    }
    void dump() 
    {
        printf("%sn", __FUNCTION__);
    }
};
static foo_t* obj_test(dumy_t* p)
{
    printf("%sn", __FUNCTION__);
    return p;
}
void test_register_base_class(ffpython_t& ffpython)
{
    ffpython.reg_class("foo_t")
            .reg(&foo_t::get_value, "get_value")
            .reg(&foo_t::set_value, "set_value")
            .reg(&foo_t::test_stl, "test_stl")
            .reg_property(&foo_t::m_value, "m_value");
    ffpython.reg_class("dumy_t", "dumy_t class inherit foo_t ctor ", "foo_t")
        .reg(&dumy_t::dump, "dump");
    ffpython.reg(obj_test, "obj_test");
    ffpython.init();
    ffpython.call("fftest", "test_register_base_class");
};



    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 请问在哪下载嵌入式Linux开发平台???想学嵌入式开发!!!
  • 有谁做过嵌入式 Linux开发?是否有嵌入式Linux的JVM?
  • 嵌入式网络编程与非嵌入式网络编程有什么不同
  • 怎样把自己做的一个软件嵌入到JBuilder中,把它变成Jbuilder的一个功能,就想东方网译嵌入到IE里一样。
  • 问一个弱弱的问题:做嵌入式开发,宿主机的Linux版本一定要跟目标机上的嵌入式Linux版本一致么?
  • 我怎么糊涂了:想开发嵌入式系统(目标机采用UCLINUX嵌入式操作系统),在RED HAT LINUX下开发,选用什么工具呢?QT还是qt embedded?
  • 嵌入式linux开发:一段代码在windows平台用VC编译运行正常,在linux平台用gcc编译运行正常,但是用arm-linux-gcc编译在嵌入式板子上运行就不正常.
  • 请问什么是嵌入式数据库?(空)
  • 关于“嵌入式Linux”
  • 嵌入式系统的学习
  • 嵌入式学习方法
  • 请问:构建一个嵌入式开发环境时的疑问?
  • linux 嵌入式开发用买开发板吗?
  • 求嵌入式Linux的入门书籍!
  • 嵌入式应用开发协作系统 Yocto
  • 嵌入式系统的C运行库 Newlib
  • 嵌入式GLIBC EGLIBC
  • Linux的嵌入式开发,请高手指点
  • 驱动程序开发和嵌入式开发有什么联系吗?
  • 嵌入式 syslog


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3