您的位置:首页 > 编程语言 > C语言/C++

利用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,)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: