博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用ffpython嵌入和扩展python
阅读量:5272 次
发布时间:2019-06-14

本文共 6227 字,大约阅读时间需要 20 分钟。

ffpython

ffpython is a c++ lib,which is to simplify task that embed python and extend python. For example, call python function, register c++ function to python, register c++ class to python. Only one implement c++ header file.

Project Goals

  • easier to embed python script
  • easier to call python function
  • easier to set or get var in python script
  • easier to extend python with c++ static function
  • easier to extend python with c++ class. C++ class Once registed, python can use it like builtin type.
  • when python exception throw, ffpython will wrap it as a std exception which includes python traceback info.

Supported Python versions

  • python2.5 python2.6 python2.7, win / linux
  • python3.x is being developed, but unfortunately, python3.x api is so different to python2.x, even diffent between python3.2 and python3.3, Headache!!

Embed Python script in C++

Get / Set varialbe in python script/module

printf("sys.version=%s\n", ffpython.get_global_var
("sys", "version").c_str()); ffpython.set_global_var("fftest", "global_var", "OhNice"); printf("fftest.global_var=%s\n", ffpython.get_global_var
("fftest", "global_var").c_str());

 

call python function, Support all base type as arg or return value. Nine args can be supported.

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

 

call python function, Support all STL type as arg or return value. Nine args can be supported. Vector and List for tuple and list in python,map for dict in python.

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); typedef map
> > ret_t; ret_t val = ffpython.call
("fftest", "test_return_stl");

 

Extend Python

register c++ static function, all base type supported. Arg num can be nine.

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("%s\n", __FUNCTION__); return ret; }};void test_reg_function(){ ffpython_t ffpython;//("ext1"); ffpython.reg(&print_val, "print_val") .reg(&ops_t::return_stl, "return_stl"); ffpython.init("ext1"); ffpython.call
("fftest", "test_reg_function");}

 

register c++ class, python can use it just like builtin types.

class foo_t{public:    foo_t(int v_):m_value(v_)    {        printf("%s\n", __FUNCTION__);    }    virtual ~foo_t()    {        printf("%s\n", __FUNCTION__);    }    int get_value() const { return m_value; }    void set_value(int v_) { m_value = v_; }    void test_stl(map
>& v_) { printf("%s\n", __FUNCTION__); } int m_value;};class dumy_t: public foo_t{public: dumy_t(int v_):foo_t(v_) { printf("%s\n", __FUNCTION__); } ~dumy_t() { printf("%s\n", __FUNCTION__); } void dump() { printf("%s\n", __FUNCTION__); }};static foo_t* obj_test(dumy_t* p){ printf("%s\n", __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("ext2"); ffpython.call
("fftest", "test_register_base_class");};

 

Register c++ class which inherit a class having been registered.

ffpython.call
("fftest", "test_register_inherit_class");

 

C++ object pointer can be as a arg to python, and object can be access as a instance of builtin type in python.

void test_cpp_obj_to_py(ffpython_t& ffpython){    foo_t tmp_foo(2013);    ffpython.call
("fftest", "test_cpp_obj_to_py", &tmp_foo);}void test_cpp_obj_py_obj(ffpython_t& ffpython){ dumy_t tmp_foo(2013); foo_t* p = ffpython.call
("fftest", "test_cpp_obj_py_obj", &tmp_foo);}

 

Python test script

def test_base(a1, a2, a3):    print('test_base', a1, a2, a3)    return 0def test_stl(a1, a2, a3):    print('test_stl', a1, a2, a3)    return Truedef test_return_stl():    print('test_return_stl')    #map
> > ret = {
'Oh':[[111,222], [333, 444] ] } return retdef test_reg_function(): import ext1 ext1.print_val(123, 45.6 , "----789---", [3.14]) ret = ext1.return_stl() print('test_reg_function', ret)def test_register_base_class(): import ext2 foo = ext2.foo_t(20130426) print("test_register_base_class get_val:", foo.get_value()) foo.set_value(778899) print("test_register_base_class get_val:", foo.get_value(), foo.m_value) foo.test_stl({
"key": [11,22,33] }) print('test_register_base_class test_register_base_class', foo)def test_register_inherit_class(): import ext2 dumy = ext2.dumy_t(20130426) print("test_register_inherit_class get_val:", dumy.get_value()) dumy.set_value(778899) print("test_register_inherit_class get_val:", dumy.get_value(), dumy.m_value) dumy.test_stl({
"key": [11,22,33] }) dumy.dump() print('test_register_inherit_class', dumy)def test_cpp_obj_to_py(foo): import ext2 print("test_cpp_obj_to_py get_val:", foo.get_value()) foo.set_value(778899) print("test_cpp_obj_to_py get_val:", foo.get_value(), foo.m_value) foo.test_stl({
"key": [11,22,33] }) print('test_cpp_obj_to_py test_register_base_class', foo)def test_cpp_obj_py_obj(dumy): import ext2 print("test_cpp_obj_py_obj get_val:", dumy.get_value()) dumy.set_value(778899) print("test_cpp_obj_py_obj get_val:", dumy.get_value(), dumy.m_value) dumy.test_stl({
"key": [11,22,33] }) dumy.dump() ext2.obj_test(dumy) print('test_cpp_obj_py_obj', dumy) return dumy

 

Summary

更多精彩文章 

转载于:https://www.cnblogs.com/zhiranok/archive/2013/05/04/ffpython.html

你可能感兴趣的文章
阅读《effective java-第17条》遇到的问题解决与分享
查看>>
什么时候用GET?什么时候用POST?
查看>>
VS上编译Lua5.1.4生成静态库
查看>>
JS常用方法函数整理
查看>>
软件工程网上的第一次作业
查看>>
AFN Post方法 设置请求头(json)
查看>>
学习C# XmlSerializer 序列化反序列化XML
查看>>
java学习笔记19(Arrays类)
查看>>
datagridview使用tooltip控件显示单元格内容
查看>>
【转】C/C++基本编程技能
查看>>
HTML5/CSS3(PrefixFree.js) 3D文字特效
查看>>
live555学习笔记6-建立RTP会话
查看>>
[选择性翻译][HDP Ambari 2.2.2安装使用说明][2]
查看>>
canvas坐标操作
查看>>
shell 基础
查看>>
vue跨域代理配置
查看>>
NuxtJS实战,一个博客系统
查看>>
修改默认的undo_retention参数设置
查看>>
Dapper 仓储接口类 实现总结
查看>>
参数错误。 (异常来自 HRESULT:0x80070057 (E_INVALIDARG))
查看>>