利用Swig在python中调用C/C++代码
2017-10-30 21:09
1346 查看
用途
当我们在开发Python程序的时候,我们可以利用Python的特性来进行敏捷开发,但有时候我们可能在程序的关键地方需要比较高的运行效率,或者当我们与底层进行通信时要使用C++来运行,这时我们可以有两种方法。一是使用subprocess模块打开编译好的exe程序,与exe程序进行通信,二是利用Swig工具将C++代码转化为Python文件进行调用,本文主要讲解第二种方法。本文参考了:在Python中调用C++,CSDN博客
1.创建要包装的.h文件和.cpp文件
example.h头文件的内容如下:#include <iostream> #include <string> #include <vector> using namespace std; class Example { public: Example(); void AddData(double data); vector<double> GetData(); private: vector<double> m_vData; };
examp.cpp文件的内容如下:
#include "example.h" Example::Example() { } void Example::AddData(double data) { m_vData.push_back(data); } vector<double> Example::GetData() { return m_vData; }
2.编写example.i文件
example.i文件时一个说明文件,Swig通过该文件的信息来生成_wrap.cxx文件,关于.i文件的写法可以参考给出的链接或者Swig的参考文档,本例的.i文件内容如下:%module example /*此处为要包含的头文件*/ %{ #include "example.h" %} /*对STL的支持*/ %include stl.i /*如果你想使用复合类型,例如vector<string>,请务必在.i文件中声明!*/ namespace std{ %template(VectorOfDouble)vector<double>; }; %include "example.h"
3.生成_wrap.cxx和py文件
执行shell命令生成该文件,python脚本内容如下:#!/usr/bin/env python3 # -*- coding: utf-8 -*- ''' python file to excute swig shell command ''' from os import system system('swig -python -c++ example.i')
4. 利用distutils生成动态库
python自带一个distutils工具,可以用它来创建python的扩展模块。使用它也很简单,只需要先定义一个配置文件,通常是命名为setup.py#!/usr/bin/env python3 # -*- coding: utf-8 -*- ''' setup.py file for SWIG example ''' from distutils.core import setup,Extension example_module = Extension('_example',sources = ['example_wrap.cxx','example.cpp'],) setup(name = 'example', version = '0.1', author = 'WingC', description = 'Simple swig example', ext_modules = [example_module], py_modules = ['example'], )
5.生成动态链接库.pyd文件
编写一个build_shell.py文件执行shell命令生成example.pyd#!/usr/bin/env python3 # -*- coding: utf-8 -*- ''' python file to generate .pyd ''' from os import system system('python setup.py build_ext --inplace')
6.将example.pyd和example.py移动到自己的模块中即可调用,实例代码如下:
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import example e = example.Example() e.AddData(10) print(e.GetData()) #程序输出为:(10.0,)
相关文章推荐
- 利用swig实现python调用C/C++的方法
- 通过SWIG封装C/C++代码被Python调用
- 利用swig实现python调用C/C++的方法
- 利用swig实现python调用C/C++的方法
- 使用SWIG实现Python调用C/C++代码
- 【2013】实习收获4:关于python中利用ctypes调用c++代码的学习总结
- 使用swig在python中调用c++代码
- Linux下利用SWIG完成Python对使用OpenCV的C++文件的调用
- python 利用swig 调用c++的接口。
- Android 学习笔记——利用JNI技术在Android中调用、调试C++代码
- 如何让python调用C和C++代码
- centos中使用swig实现python调用c++
- C++调用Python代码
- 使用swig从c/c++代码生成java/python/R/php...代码
- 利用swig,在python中使用C++的类
- Android 学习笔记——利用JNI技术在Android中调用、调试C++代码
- Android 学习笔记——利用JNI技术在Android中调用、调试C++代码
- centos7下使用swig扩展python接口来调用c++ 实现声纹识别
- linux下使用swig让python调用C++(复杂版:包括多文件调用和链接库)
- window下利用JNI在java代码中调用c/c++接口