zoukankan      html  css  js  c++  java
  • 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的文章。
  • 相关阅读:
    asp网站中使用百度ueditor教程
    URL特殊字符需转义
    织梦DEDE文章列表前面自动加递增数字标签
    dede修改templets模板文件夹后,出现“无法在这个位置找到: ”错误的解决办法
    Mysql命令大全
    成功,来自有梦想,肯坚持
    飞天侠模板的相关修改教程
    bios自检时间长,显示0075错误
    电脑桌面假死解决方法
    没有哪个人是随随便便成功的
  • 原文地址:https://www.cnblogs.com/lexus/p/2818730.html
Copyright © 2011-2022 走看看