• python绑定c++程序


    很多时候需要给c++程序提供一种使用上的灵活性,脚本语言在这里就变得很重要了。采用Boost.Python为c++程序加一层shell,比较简单、简洁,对原有的c++代码也没有侵入性。今天试了一下,感觉不错,可以把它集成在现在正在做的项目中。

    我主要参照David Abrahams的"Building Hybrid Systems with Boost.Python"(http://www.boost-consulting.com/writing/bpl.html)一文,该文中对编译 过程说的较少,偶就略做补充,为新手节省点时间(偶也是python新手)。

    为c++类加python shell过程基本上如下:
    (1)为c++类编写一个Boost.Python wrapper
    (2)编译成so
    (3)可以在python中调用了

    针对David Abrahams的例子,偶的源文件如下:

    例1:hello world 函数
    (1)hello.cpp
    #include <stdexcept>
    char const* greet(unsigned x)
    {
       
    static char const* const msgs[] = { "hello""Boost.Python""world!" };

       
    if (x > 2
           
    throw std::range_error("greet: index out of range");

       
    return msgs[x];
    }
    (2)hello_wrap.cpp
    #include <boost/python.hpp>

    using namespace boost::python;

    char const* greet(unsigned x);

    BOOST_PYTHON_MODULE(hello)
    {
        def(
    "greet", greet, "return one of 3 parts of a greeting");
    }
    (3)makefile
    PYTHON_INCLUDE_FLAGS = \
        
    -I/usr/include/python2.4

    LIB_FLAGS 
    = \
        
    -lboost_python

    SOURCE 
    = \
        hello.cpp hello_wrap.cpp

    all:${SOURCE}
        g
    ++ ${PYTHON_INCLUDE_FLAGS} ${SOURCE} ${LIB_FLAGS} -shared -o hello.so
    clean:
        rm 
    -f hello *.o *.out *.so
    (4)hello.py
    import hello
    for x in range(3):
        print hello.greet(x)
    例2:hello world类
    (1)hello_class.cpp
    #include <boost/python.hpp>
    #include 
    <iostream>
    using namespace std;
    using namespace boost::python;

    class World
    {
    public:

        
    void set(std::string msg) { this->msg = msg; }
        
        
    void greet() 
        {
            cout 
    << this->msg << endl; 
         }
         
        
    string msg;
    };

    BOOST_PYTHON_MODULE(hello)
    {
        class_
    <World> w("World");
        w.def(
    "greet"&World::greet);
        w.def(
    "set"&World::set);
    };

    (2)makefile
    PYTHON_INCLUDE_FLAGS = \
        
    -I/usr/include/python2.4

    LIB_FLAGS 
    = \
        
    -lboost_python

    SOURCE 
    = \
        hello_class.cpp

    all:${SOURCE}
        g
    ++ ${PYTHON_INCLUDE_FLAGS} ${SOURCE} ${LIB_FLAGS} -shared -o hello.so
    clean:
        rm 
    -f hello *.o *.out *.so
    (3)hello_class.py
    import hello
    planet 
    = hello.World()
    planet.
    set('howdy')
    planet.greet()

    更复杂的调用见上面提到的David Abrahams的文章。

    版权所有,欢迎转载
  • 相关阅读:
    C++11——Lambda表达式
    匿名空间使用
    C++11——可调用对象包装器、绑定器
    winhttp 发送https的get请求
    C++11——基于范围的for循环
    C++11——列表初始化
    C++11——委托构造和继承构造函数
    C++11——using的使用
    使用appnium,Uiautomatorviewer连接手机报错:Unexpected error while obtaining UI hierarchy java.lang.reflect.Invocation【已解决】
    逆向 | IATHook 全屏加速挂
  • 原文地址:https://www.cnblogs.com/xiaotie/p/335633.html
Copyright © 2020-2023  润新知