python 利用swig 调用c++的接口。
2017-02-25 00:00
260 查看
摘要: 编译多个cxx文件
本文所用例子是 swig2.0-examples里Python的class目录里的代码。
具体的c++ 代码如下所示。
python接口的文档如下所示,后缀通常都是python.i.
module 对应着具体so的名字。在生成的py文件里。会import _{module}.so。
调用 下行命令生成 example_wrap.cxx, 和example.py 文件。
调用如下命令生成example.o
调用如下命令生成example_wrap.o -I 是用来链接example_wrap.cxx 里的Python.h的头文件。
如果没有包含这个头文件。则apt-get 下个python的dev包。
再调用如下命令生成c++ 的so文件。so文件的名字文件对应着.i文件里的module而且要加_
这时候,我们调用python
还有另外一种编译的方式。用distutils来编译。写脚本如下,setup.py
调用如下命令编译得到py文件和so文件。
接下来说说编译多个.cxx或.cpp文件
用g++ 文件的方式编译链接so时在这个命令里把其他.cxx文件也一起编译成.o,也可以将*_wrap.cxx一起编译成.o ,这时候也要添加Python.h的链接路径。接下来把他们链接成so。就可以了。
第二种方法。
在soureces里添加其他要添加的cxx。Extension还可以添加其他要链接的so。
本文所用例子是 swig2.0-examples里Python的class目录里的代码。
具体的c++ 代码如下所示。
/* File : example.h */ class Shape { public: Shape() { nshapes++; } virtual ~Shape() { nshapes--; }; double x, y; void move(double dx, double dy); virtual double area(void) = 0; virtual double perimeter(void) = 0; static int nshapes; }; class Circle : public Shape { private: double radius; public: Circle(double r) : radius(r) { }; virtual double area(void); virtual double perimeter(void); }; class Square : public Shape { private: double width; public: Square(double w) : width(w) { }; virtual double area(void); virtual double perimeter(void); }; /* 文件名是example.cxx*/ /* File : example.c */ #include "example.h" #define M_PI 3.14159265358979323846 /* Move the shape to a new location */ void Shape::move(double dx, double dy) { x += dx; y += dy; } int Shape::nshapes = 0; double Circle::area(void) { return M_PI*radius*radius; } double Circle::perimeter(void) { return 2*M_PI*radius; } double Square::area(void) { return width*width; } double Square::perimeter(void) { return 4*width; }
python接口的文档如下所示,后缀通常都是python.i.
module 对应着具体so的名字。在生成的py文件里。会import _{module}.so。
/* File : example.i */ %module example %{ #include "example.h" %} /* Let's just grab the original header file here */ %include "example.h"
调用 下行命令生成 example_wrap.cxx, 和example.py 文件。
xxx@xxx-K43SJ:/usr/share/doc/swig2.0-examples/python/class$ sudo swig2.0 -c++ -python example.i
调用如下命令生成example.o
sudo g++ -O2 -fPIC -c example.cxx
调用如下命令生成example_wrap.o -I 是用来链接example_wrap.cxx 里的Python.h的头文件。
如果没有包含这个头文件。则apt-get 下个python的dev包。
sudo g++ -O2 -fPIC -c example_wrap.cxx -I /usr/include/python2.7/
再调用如下命令生成c++ 的so文件。so文件的名字文件对应着.i文件里的module而且要加_
sudo g++ -shared *.o -o _example.so
这时候,我们调用python
xxx@xxx-K43SJ:/usr/share/doc/swig2.0-examples/python/class$ python Python 2.7.6 (default, Oct 26 2016, 20:30:19) [GCC 4.8.4] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> from example import * >>> dir() ['Circle', 'Circle_swigregister', 'Shape', 'Shape_swigregister', 'Square', 'Square_swigregister', '__builtins__', '__doc__', '__name__', '__package__', 'cvar'] >>> c = Circle(10) >>> dir(c) ['__class__', '__del__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattr__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__swig_destroy__', '__swig_getmethods__', '__swig_setmethods__', '__weakref__', '_s', 'area', 'move', 'nshapes', 'perimeter', 'this', 'x', 'y'] >>> c.area() 314.1592653589793 >>> c.perimeter() 62.83185307179586 >>> c.nshapes() Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'int' object is not callable >>> c.nshapes 1 >>>
还有另外一种编译的方式。用distutils来编译。写脚本如下,setup.py
#!/usr/bin/env python """ setup.py file for SWIG example """ from distutils.core import setup, Extension example_module = Extension('_example', sources=['example_wrap.cxx', 'example.cxx'], ) setup (name = 'example', version = '0.1', author = "SWIG Docs", description = """Simple swig example from docs""", ext_modules = [example_module], py_modules = ["example"], )
调用如下命令编译得到py文件和so文件。
sudo python setup.py build_ext --inplace
接下来说说编译多个.cxx或.cpp文件
用g++ 文件的方式编译链接so时在这个命令里把其他.cxx文件也一起编译成.o,也可以将*_wrap.cxx一起编译成.o ,这时候也要添加Python.h的链接路径。接下来把他们链接成so。就可以了。
sudo g++ -O2 -fPIC -c *.cxx
第二种方法。
在soureces里添加其他要添加的cxx。Extension还可以添加其他要链接的so。
example_module = Extension('_example', sources=['example_wrap.cxx', 'example.cxx', 'hello.cxx'], )
相关文章推荐
- 利用Swig在python中调用C/C++代码
- 在VS中利用swig导出c/c++ 的python接口文件
- 利用swig实现python调用C/C++的方法
- SWIG之为C/C++的API生成Python调用接口基础
- Linux下利用SWIG完成Python对使用OpenCV的C++文件的调用
- centos7下使用swig扩展python接口来调用c++ 实现声纹识别
- 利用swig实现python调用C/C++的方法
- VS中利用swig实现c/c++导出python接口
- 利用swig实现python调用C/C++的方法
- Linux使用Python调用C/C++接口
- python 中用SWIG包装C和C++和接口生成的例子
- c++调用python函数接口
- 利用SWIG对C++库进行Python包装
- Windows下python使用SWIG调用C++ dll
- python&nbsp;中用SWIG包装C和C++和接口…
- Python调用C/C++的接口(Boost)
- QT C++中直接调用python接口
- c++调用python封装接口
- 利用 SWIG 转换 C/C++ 接口到 Java 接口
- 【2013】实习收获4:关于python中利用ctypes调用c++代码的学习总结