Linux下C++编写Python扩展模块和Python调用so动态库

4049 人浏览 | 时间: 2017-01-17 14:57:09 | 作者: codexia 会员文章,禁止转载
    在文章《Windows下使用C++编写Python的扩展模块详细说明》整理了Windows上用C++编写Python扩展模块的一种方法。然而再在Linux上用C++编写Python扩展模块又是困难重重。Linux方面这方面资料似乎很少,反正查了很久,要么是Windows方面的,要么就是使用ctypes动态加载so库。反正不是我想要的。
    下面我来详细的总结下,供需要的人参考。

环境:CentOS7+Python2.7.2

1.C++编写Python调用的接口函数
#include <Python.h>

//导出给Python用的函数
static PyObject* Add(PyObject*self,PyObject*args)
{
    int x = 0;
    int y = 0;
    int z = 0;
    if(!PyArg_ParseTuple(args,"i|i", &x,  &y))
    return NULL;
    z=x +y;
    return Py_BuildValue("i",z);
}
//导出函数列表
static PyMethodDef PyExtMethods[]=
{
    {"Add", Add,METH_VARARGS,"Addtwo  number - edit by magictong."},
    {NULL,NULL, 0,NULL}
};
//初始化
PyMODINIT_FUNC initlibCjjjs()
{
    Py_InitModule("libCjjjs",PyExtMethods);
}

    代码和Windows上的大体相同,但是在初始化函数上需要注意。python在调用so库的时候,会识别文件名,也就是识别lib开头和.so结尾的文件。中间的就是库名,比如libCjjjs.so。所以最终得到的是libCjjjs.so,你不能将lib和so去掉。另外,初始化函数名必须是initlib库名。Py_InitModule("libCjjjs",PyExtMethods)中的第一个参数必须是"lib库名"。因为lib是Linux动态库名字开头的一个约定,然后和Python结合,也就是这样的命名规则了。这个地方很容易出错。

2.编译C++编写的Python扩展动态库
g++ -I/usr/local/include/python2.7/ -shared -fPIC main.cpp -o libCjjjs.so -L/usr/local/li
开通会员>>阅读全文
标注
评论
站内搜
百度搜
传送到手机
手机扫码,识别文字,完成传送x
加载中...
标注内容x
加载中...
添加标注x
收藏 1 点赞 0