Python源码剖析学习一

1.Python粗猎

分析python,以及webpy,边完成那个web系统,作为对python的一个总结

如何从源代码编译出Python可执行程序。
在整个剖析源码的过程中,最好的学习方发就是不断根据掌握的知识修改Python的源代码,以印证自己的
猜想和知识

 

Python的运行时环境,包括对象/类型系统(Object/Type structures)、内存分配器(Memory
Allocator)和运行时状态信息(Current State of Python)。

运行时状态维护了解释器在执行字节码时不同的状态(比如正常状态和异常状态)之间切换的动作,可以将
它视为一个巨大而复杂的有穷状态机。

内存分配器则全权负责Python中创建对象时,对内存的申请工作,实际上它就是Python运行时与C中
malloc的一层接口。

对象/类型系统则包含了Python中存在的各种内建对象

 

Python的核心----解释器(interpreter),或者称为虚拟机
Scanner(对应词法分析)----Parse(对应语法分析),建立抽象语法树(AST)----Python字节码(byte
code)----Code Evaluator来执行这些字节码,又称为虚拟机


Python的C API中提供了一个输出对象的接口PyObject_Print(PyObject *,FILE *,int);
PyString_FromString是Python提供的用于从C中的原生字符数组创建出Python中的字符串对象。

 

2.Python源码调试技巧

做webpy,学习<<Python源码剖析>>这本书,以期对py有一个深入的理解
监视Python内部运行时的一个技巧----设置条件
通过添加一些条件点,获取你想得到的一些信息

static int
int_print(PyIntObject *v, FILE *fp, int flags)
/* flags -- not used but required by interface */
{
//add by moonflow
//PyObject* str = PyString_FromString("i am in int_print");
//PyObject_Print(str,stdout,0);
//printf("\n");
//add by moonflow
if(PyInt_AsLong(v) == -999){
PyObject* str = PyString_FromString("i am in int_repr");
PyObject* out = PySys_GetObject("stdout");
if(out != NULL){
PyObject_Print(str,stdout,0);
printf("\n");
}
}
//oringal
fprintf(fp, "%ld", v->ob_ival);
return 0;
}

彻底理解Python运行时行为,就会知道如何利用Python的C API来编写Python扩展,如何在C中内嵌Python解释器等

Python2.5的源码中,Python自定义了一个新的类型Py_ssize_t 


posted @ 2012-01-17 15:25  yarpee  阅读(863)  评论(0编辑  收藏  举报