Python:C语言扩展

Python:C语言扩展

(2013-05-29 14:38:02)
标签:

杂谈

分类:Python
 
    没有什么比对着书敲的代码仍然出错更令人沮丧了。《Python编程入门经典》这本书错误真是多,它以python3为基础,但是里面用到了很多python2的内容,导致一些函数名或模块名对不上号,白白浪费时间。下面的Py_InitModule3在Python3.3中真是没找到,但是python2.6就可以实现,还有网络编程中str和bytes的区别问题,作者不把这些点出来,对于Python小白,着实很着急啊~~~
***************************************************************************************************
      一个Python扩展模块是一个普通的C语言库,对于UNIX计算机,这些库通常以.so(表示共享对象)结尾。Python模块会把代码分成3个部分:
(1)希望作为模块接口呈现的C函数;
(2)将Python开发人员所看到的那些函数的名称映射为扩展模块中的C函数的一个表;
(3)初始化函数;

大多数扩展模块可以包含在一个单独的C源文件中,这个文件被称为胶水文件,启动包含Python.h的文件,它允许访问内部的PythonAPI,这些API将模块与解释器相关联。下面分别来讲解上述的三个部分。
****************************************************************************************************
C函数签名:
函数的C语言实现的签名总是采用如下三个形式之一
(1)PyObject *MyFunction(PyObject *self , PyObject *args);
(2)PyObject *MyFunction(PyObject *self , PyObject *args , PyObject*kw);
(3)PyObject *MyFunction(PyObject *self);
通常,C函数会采用第一种形式,传递到这些函数中的参数被包装成一个元组,为了使用这些参数,必须分解它们,可以使用PyArg_ParseTuple函数和PyArg_ParseTupleAndKeywords函数
PyArg_ParseTuple(args , "ids" , &i ,&d , &s)
将args分成int , double , char*,分别存入i , d , s
****************************************************************************************************
方法表:
方法表是PyMethodDef结构的一个简单数组
struct PyMethodDef
{
  char                *ml_name;      #Python中使用的名字
  PyCFunction  ml_meth;        #C函数的名字
  int                  ml_flags;      #表示使用哪种C函数的签名形式
  char                ml_doc;          #函数的字符串文档
};
ml_flags向解释器表明ml_meth正使用三个签名中的哪一个。ml_flags的值通常是METH_VARARGS。如果希望将关键字参数引入到函数中,那么这个值可以与METH_KEYWORDS按位或。它的值也可以是METH_NOARGS,表示不希望接受任何形式的参数。
下面是是一个例子,包含函数MyFunction的表:
static PyMethodDef myFunction[] = {
  {"pythonName" , (PyCFuntion)MyFunction ,METH_NOARGS , "my first function"} ,
  { NULL , NULL , 0 , NULL}
};

****************************************************************************************************
初始化函数:
扩展模块的最后一部分是初始化函数。当模块被加载时,Python解释器调用此函数。需要将函数命名为init模块名,例如initChenhuan,模块名为Chenhuan
****************************************************************************************************
下面是一个典型的C扩展模块:
Python:C语言扩展
个人比较喜欢用g++来编译,error和warming区分的很清楚,格式如下:
g++ -Wall -shared -I /usr/local/python2.6foo.c -o foo.so
成功的话,会在文件夹下生成foo.so,就可以使用这个模块了:
Python:C语言扩展
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值