美文网首页工具癖软件测试Python专家之路程序员
python3工具库boost介绍 用c++为python编写扩

python3工具库boost介绍 用c++为python编写扩

作者: python测试开发 | 来源:发表于2018-09-20 10:45 被阅读56次

    概述

    有不同的方法来用C++扩展Python:

    • Swig
    • 使用Boost.Python,可选择使用Py++预处理
    • 使用Cython。

    Cython出现之前,Boost.Python是编写C ++扩展模块最爽的方式。

    Boost.Python集成在Boost C++ Libraries中。 要在Ubuntu系统上安装;

    $ sudo apt-get install libboost-python-dev 
    $ sudo apt-get install python-dev
    

    快速入门

    hellomodule.cpp

    #include <iostream>
    
    using namespace std;
    
    void say_hello(const char* name) {
        cout << "Hello " <<  name << "!\n";
    }
    
    #include <boost/python/module.hpp>
    #include <boost/python/def.hpp>
    using namespace boost::python;
    
    BOOST_PYTHON_MODULE(hello)
    {
        def("say_hello", say_hello);
    }
    

    setup.py

    #!/usr/bin/env python
    # 技术支持qq群: 144081101 591302926 567351477 钉钉免费群:21745728
    
    from distutils.core import setup
    from distutils.extension import Extension
    
    setup(name="PackageName",
        ext_modules=[
            Extension("hello", ["hellomodule.cpp"],
            libraries = ["boost_python"])
        ])
    
    

    编译:

     python2.7 setup.py build
    running build
    running build_ext
    building 'hello' extension
    creating build/temp.linux-x86_64-2.7
    x86_64-linux-gnu-gcc -pthread -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fno-strict-aliasing -Wdate-time -D_FORTIFY_SOURCE=2 -g -fdebug-prefix-map=/build/python2.7-nbjU53/python2.7-2.7.15~rc1=. -fstack-protector-strong -Wformat -Werror=format-security -fPIC -I/usr/include/python2.7 -c hellomodule.cpp -o build/temp.linux-x86_64-2.7/hellomodule.o
    cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++
    creating build/lib.linux-x86_64-2.7
    x86_64-linux-gnu-g++ -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions -Wl,-z,relro -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -Wdate-time -D_FORTIFY_SOURCE=2 -g -fdebug-prefix-map=/build/python2.7-nbjU53/python2.7-2.7.15~rc1=. -fstack-protector-strong -Wformat -Werror=format-security -Wl,-Bsymbolic-functions -Wl,-z,relro -Wdate-time -D_FORTIFY_SOURCE=2 -g -fdebug-prefix-map=/build/python2.7-nbjU53/python2.7-2.7.15~rc1=. -fstack-protector-strong -Wformat -Werror=format-security build/temp.linux-x86_64-2.7/hellomodule.o -lboost_python -o build/lib.linux-x86_64-2.7/hello.so
    
    

    执行:

    $ python2.7
    Python 2.7.15rc1 (default, Apr 15 2018, 21:51:34) 
    [GCC 7.3.0] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import hello
    >>> hello.say_hello("World")
    Hello World!
    

    python3怎么办?

    $ python3
    Python 3.6.5 |Anaconda, Inc.| (default, Apr 29 2018, 16:14:56) 
    [GCC 7.2.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import hello
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ImportError: /usr/lib/x86_64-linux-gnu/libboost_python-py27.so.1.65.1: undefined symbol: PyClass_Type
    

    setup.py

    #!/usr/bin/env python
    
    from distutils.core import setup
    from distutils.extension import Extension
    
    setup(name="PackageName",
        ext_modules=[
            Extension("hello", ["hellomodule.cpp"],
            libraries = ["boost_python"])
        ])
    
    

    编译:

    $ python3 setup.py build
    running build
    running build_ext
    building 'hello' extension
    creating build
    creating build/temp.linux-x86_64-3.6
    gcc -pthread -B /usr/local/anaconda/compiler_compat -Wl,--sysroot=/ -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -I/usr/local/anaconda/include/python3.6m -c hellomodule.cpp -o build/temp.linux-x86_64-3.6/hellomodule.o
    cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++
    creating build/lib.linux-x86_64-3.6
    g++ -pthread -shared -B /usr/local/anaconda/compiler_compat -L/usr/local/anaconda/lib -Wl,-rpath=/usr/local/anaconda/lib -Wl,--no-as-needed -Wl,--sysroot=/ build/temp.linux-x86_64-3.6/hellomodule.o -lboost_python3-py36 -o build/lib.linux-x86_64-3.6/hello.cpython-36m-x86_64-linux-gnu.so
    
    

    执行:

    $ python3 
    Python 3.6.5 |Anaconda, Inc.| (default, Apr 29 2018, 16:14:56) 
    [GCC 7.2.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import hello
    >>> hello.say_hello("World")
    Hello World!
    

    如何知道用哪个python so?

    $ ll /usr/lib/x86_64-linux-gnu/libboost_python*.so
    lrwxrwxrwx 1 root root 31 3月   6 18:21 /usr/lib/x86_64-linux-gnu/libboost_python3-py36.so -> libboost_python3-py36.so.1.65.1
    lrwxrwxrwx 1 root root 24 3月   6 18:21 /usr/lib/x86_64-linux-gnu/libboost_python3.so -> libboost_python3-py36.so
    lrwxrwxrwx 1 root root 30 3月   6 18:21 /usr/lib/x86_64-linux-gnu/libboost_python-py27.so -> libboost_python-py27.so.1.65.1
    lrwxrwxrwx 1 root root 24 3月   6 18:21 /usr/lib/x86_64-linux-gnu/libboost_python-py36.so -> libboost_python3-py
    

    参考资料

    相关文章

      网友评论

        本文标题:python3工具库boost介绍 用c++为python编写扩

        本文链接:https://www.haomeiwen.com/subject/chpgnftx.html