博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【python笔记】扩展模块
阅读量:5766 次
发布时间:2019-06-18

本文共 2857 字,大约阅读时间需要 9 分钟。

一个典型的Python扩展模块至少应该包含三个部分:导出函数、方法列表和初始化函数

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

   

1、模块编写

==============================================mym.c======================begin

/*filename mym.c*/

#include "Python.h"

   

double func(double x,double y)

{

return x+y;

}

   

/*------------------导出函数-----------------------------*/

/*

* PyObject* method(PyObject* self, PyObject* args);

* 该函数是Python解释器和C函数进行交互的接口,

* 带有两个参数:self和args。

* 参数self只在C函数被实现为内联方法(built-in method)时才被用到,通常该参数的值为空(NULL)。

* 参数args中包含了Python解释器要传递给C函数的所有参数,

* 通常使用Python的C语言扩展接口提供的函数PyArg_ParseTuple()来获得这些参数值。

*/

/*对函数进行包装,每一个Python对象在C中都是PyObject* 类型*/

static PyObject *mym_func(PyObject *self,PyObject *args)

{

double arg1, arg2, result;

if (!PyArg_ParseTuple(args,"dd",&arg1,&arg2))

{

return NULL;

}

result = func(arg1,arg2);

return Py_BuildValue("d",result);

}

/*------------------------方法列表---------------------------*/

/*

* 方法列表中给出了所有可以被Python解释器使用的方法

* 方法列表中的每项由四个部分组成:

* 方法名、导出函数、参数传递方式和方法描述。

* 方法名是从Python解释器中调用该方法时所使用的名字。

* 参数传递方式则规定了Python向C函数传递参数的具体形式,

* 可选的两种方式是METH_VARARGS和METH_KEYWORDS,

* 其中METH_VARARGS是参数传递的标准形式,它通过Python的元组在Python解释器和C函数之间传递参数,

* 若采用METH_KEYWORD方式,则Python解释器和C函数之间将通过Python的字典类型在两者之间进行参数传递

*/

/* 建立一个模块函数的列表*/

static struct PyMethodDef mymMethods[] =

{

{"func",mym_func,METH_VARARGS},

{NULL,NULL,0,NULL}

};

   

/*----------------------初始化函数------------------*/

/*

* 所有的Python扩展模块都必须要有一个初始化函数,以便Python解释器能够对模块进行正确的初始化。

* Python解释器规定所有的初始化函数的函数名都必须以init开头,并加上模块的名字。

*/

/* 对模块进行初始化*/

void initmym()

{

Py_InitModule("mym",mymMethods);

}

============================================================mym.c=================end

   

2、编译

   

要在Python解释器中使用C语言编写的扩展模块,必须将其编译成动态链接库的形式

用distutils模块对包进行编译,下面建立编译的脚本

   

============================================================setup.py================begin

#filename setup.py

   

from distutils.core import setup, Extension

import os

import sys

   

extra_compile_args = ['-q64']

extra_link_args = ['-berok','-q64']

   

my_inc = os.path.join(os.getcwd(), '.')

include_dirs = [my_inc, '/usr/include']

library_dirs = ['/usr/lib']

   

libraries = [ ]

libraries_ws = []

   

module1 = Extension(name = 'mym',

sources = ['mym.c'],

extra_compile_args = extra_compile_args,

extra_link_args = extra_link_args,

include_dirs = include_dirs,

library_dirs = library_dirs,

libraries = libraries,

)

 

setup (name = 'mym', version = '1.0', description = 'This is a demo package', ext_modules = [module1])

   

============================================================setup.py================end

   

脚本在aix 64位机器xlc_r编译器成功编译,其他机器或编译器需要修改

Python_64 setup.py build 编译成功

   

3、使用

引入Python解释器

   

由于没有安装,可能找不到mym.so文件,直接进入到build文件夹下的mym.so所在的目录中,启动python

Python_64

>>> import mym

>>> mym.func(5,3)

8.0

>>>

   

参考文档:

>

>

转载于:https://www.cnblogs.com/ningth/archive/2012/02/14/2351245.html

你可能感兴趣的文章
Angular JS: 以更RESTful的方式使用ngResource
查看>>
mysql主从配置(freebsd+mysql5.5.13)
查看>>
js常用正则表达式表单验证
查看>>
部署Zabbix Porxy
查看>>
我的友情链接
查看>>
nagios监控服务的安装和配置
查看>>
MongoDB配置mongo.cfg快速启动
查看>>
学习Javascript异步编程 持续更新
查看>>
LoadRunner压力测试结果分析探讨
查看>>
Linux系统配置多实例php-fpm服务
查看>>
C++:复数类构造函数、拷贝构造、运算符重载、析构函数
查看>>
【C++】用类实现单向单链表的尾插PushBack(),尾删PopBack(),打印PrintSlist()。
查看>>
JFinal,Jsonp,Jquery,Ajax,跨域
查看>>
【MySQL】线程状态详解
查看>>
c++ 实现动态顺序表(拷贝构造 赋值运算符重载等操作)
查看>>
老李分享:《Linux Shell脚本攻略》 要点(四)
查看>>
深入分析ThreadLocal
查看>>
分享110个超棒的免费小尺寸PSD图标icon - Micro Icon Set
查看>>
自动复制文本到剪贴版(Auto Copy to clipboard)
查看>>
centos7,监控httpd运行状态
查看>>