• python绑定c++程序


    python绑定c++程序 - xiaotie - 博客园

    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的文章。
  • 相关阅读:
    中文转数字
    半角全角互转
    sql快速查记录数
    杀进程批处理
    线程基本用法
    sql游标用法示例
    BUGFREE的使用
    SQL常用函数
    ASP.NET 2.0 下的验证码控件
    经典sql语句
  • 原文地址:https://www.cnblogs.com/lexus/p/2818730.html
Copyright © 2020-2023  润新知