用途
当我们在开发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,)