GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • python自动化测试人工智能
  • 八字
  • 测试
  • 测试框架
  • common
  • 大数据
  • 风水
  • 机器学习
  • 解梦
  • linux
  • python
  • 书籍
  • 数据分析
  • 中草药

This view

  • Original page
  • New address

GeezerVison is showing china-testing.github.io — python3外部库boost介绍 用c++为python编写扩展

  • python测试开发项目实战-目录
  • python工具书籍下载-持续更新

概述

有不同的方法来用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 

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

参考资料

  • python测试等IT技术支持qq群: 144081101(后期会录制视频存在该群群文件) 591302926 567351477
  • 道家技术-手相手诊看相中医等钉钉群21734177 qq群:391441566 184175668 338228106 看手相、面相、舌相、抽签、体质识别。服务费50元每人次起。请联系钉钉或者微信pythontesting
  • 本文最新版本地址
  • 本文涉及的python测试开发库 谢谢点赞!
  • 本文相关海量书籍下载
  • 接口自动化性能测试线上培训大纲
  • Python Programming/Extending with C++
  • C语言扩展
You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.