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