Python中有些重复简单的计算可以丢给cpp做,从而实现加速。之前写过一个python调用c++模块的文章《python调用c++》,通过引用动态链接库来完成调用。
今天介绍用Extension来扩展Python的方法。实验环境: ubuntu18.04 python3.8.8 setuptools
这里需要额外安装一个setuptools。
编写要调用的c++文件,命名为add.cpp:
include<Python.h>
#include<iostream>
using namespace std;
int add(int a,int b) {
cout<<"Cpp function is called!"<<endl;
return a + b;
}
static PyObject *Exten_add(PyObject *self,PyObject *args) {
int a,b;
if (!PyArg_ParseTuple(args,"ii",&a,&b)) {
return NULL;
}
return (PyObject*)Py_BuildValue("i",add(a,b));
}
static PyMethodDef ExtenMethods[] = {
{"add",Exten_add,METH_VARARGS},
{NULL,NULL},
};
static struct PyModuleDef ExtenModule = {
PyModuleDef_HEAD_INIT,
"MyPackage",
NULL,
-1,
ExtenMethods
};
PyMODINIT_FUNC
PyInit_MyPackage(void)
{
return PyModule_Create(&ExtenModule);
}
~
编写将c++文件编译为python可调用包的程序setup.py:
from setuptools import setup,Extension
mm = 'MyPackage'
setup(name=mm,ext_modules=[Extension(mm,sources=['add.cpp'])]
将add.cpp和setup.py放在同一个路径下。 然后运行:
python setup.py develop
然后在本地开启python:
>>> import MyPackage as mp
>>> mp.add(10, 10)
Cpp function is called!
20
这样一来,c++的函数就通过python包的形式被调用,干净又卫生~
需要提到的是:上面采用python setup.py develop而不是用build再install,主要是为了编译出的so保存在当前目录下,这样可以用一次甩一次。如果用build再install,那这个包就会安装到默认路径,关键是你卸载起来很不容易,容易造成环境垃圾。
如果你写了一个很实用的cpp函数,想称为一个python包方便以后调用,那么你就不用develop,可以直接:
python setup.py build
python setup.py install
|