python源代码是用C写的。
想改源库用python实现好像不太现实。
按你的要求,用C来extend的话很简单。
============下面是扩展库的代码===========
用C来extend源库的办法,也就是题主想修改module的办法:
step1、先要写python的wrapper,什么是wrapper?熟悉java自动装拆箱机制的应该都知道,这里不解释,作用与其类似。
比如我要在python的“二货”库中添加一个“逗逼()”方法,逗逼()的功能就是求最大公约数,这里我贴上最大公约数的实现算法以及wrapper代码:
int 逗逼(int x, int y) {
int g;
g = y;
while (x > 0) {
g = x;
y = y % x;
y = g;
}
return g;
}
wrapper:
#include "python.h"
extern int 逗逼(int, int);
/* wrapper for 逗逼 */
static PyObject *
py_逗逼(PyObject *self, PyObject *args) {
int x,y,g;
/* 获取变量 */
if (!PyArg_ParseTuple(args,"ii",&x,&y)) {
return NULL;
}
/* 调用逗逼函数 */
g = 逗逼(x,y);
/* 返回逗逼结果 */
return Py_BuildValue("i",g);
}
注:PyObject类型是python所有类的元类型,也就是所有的实例类型都是元类型的一个对象,有兴趣的可以自己撸一遍python源代码。我看过好久了,这里可能记得不准确,抽空撸撸再更正。
step2、把你写的这个外部逗逼方法打包进二货库
/* Module ’二货’
#include "python.h"
extern int 逗逼(int, int);
/* wrapper for 逗逼 */
static PyObject *
py_逗逼(PyObject *self, PyObject *args) {
}
/* 方法列表 */
static PyMethodDef 二货methods[] = {
{"逗逼", py_逗逼, METH_VARARGS},
{ NULL, NULL}
};
/* 二货库初始化 */
void init二货() {
Py_InitModule("二货",二货methods);
}
注:逗逼和二货在实际中一定要用英文。为了易读性可能会误导大家。
step3、编译你刚刚更新的库
在终端进行如下操作,建立一个启动文件,命名为“setup”。
*shared*
二货 逗逼.c 二货module.c
% cp /usr/local/lib/python2.7.4/config/Makefile.pre.in .
敲以下命令
% make -f Makefile.pre.in boot
% make
到这一步就可以为二货库创造出一个公有的逗逼方法。
注:路径要以操作系统以及安装位置为准。
即使是这样的操作也不能百分之百保证源代码的正确更改以及调用的成功性。
现在你可以引入二货,感受一下逗逼的酸爽了。
import 二货
>>>二货.逗逼(11,13)
>>>1
Mission Completed