『Python』源码解析_源码⽂件介绍
本篇代码针对2.X版本,与3.X版本细节不尽相同,由于两者架构差别不⼤加之本⼈能⼒有限,所以就使⽤2.X体验python的底层原理了。⼀、主要⽂件夹内容
Include:该⽬录下包含了Python提供的所有头⽂件,如果⽤户需要⾃⼰⽤C或C++来编写⾃定义模块扩展Python,那么就需要⽤到这⾥提供的头⽂件。
Lib:该⽬录包含了Python⾃带的所有标准库,Lib中的库都是⽤Python语⾔编写的。
Modules:该⽂件夹中包含了所有⽤C语⾔编写的模块,⽐如ramdom,cStringIO等,Modules中的模块是那些对速度要求⾮常严格的模块。⽽有⼀些对速度没有太严格要求的模块,⽐如os,就是⽤Python编写,并且放在Lib⽬录下
Parser :Parser⽬录中包含了Python解释器中的Scanner和Parser部分,即对Python源代码进⾏词法分析和语法分析的部分。除了这
些,Parser⽬录下还包含了⼀些有⽤的⼯具,这些⼯具能够根据Python语⾔的语法⾃动⽣成Python语⾔的词法和语法分析器,与YACC⾮常类似。
Objects :该⽬录中包含了所有Python的内建对象,包括整数,list,dict等;同时,该⽬录还包括了Python在运⾏时需要的所有的内部使⽤对象的实现
Python:该⽬录下包含了Python解释器中的Compiler和执⾏引擎部分,是Python运⾏的核⼼所在。
PCBuild :包含了Visual Studio 2003⼯程⽂件,研究Python源代码就从这⾥开始,实际使⽤中我使⽤的是VS 2015。
⼆、⼏个标准函数
1、输出python对象的接⼝函数
python/外部依赖项/object.h/
PyAPI_FUNC(int) PyObject_Print(PyObject *, FILE *, int);
2、从C的原⽣字符数组创建出Python字符串对象
PyObject* str = PyString_FromString("I am in int_print");
3、将Python的整数对象转化为C中的int型
PyInt_AsLong(v)
4、获取Python中sys对象(获取形式采取对象的字符串)
PyObject* out = PySys_GetObject("stdout");
python printf输出格式三、修改源码⽰意
pythoncore/Objects/intobject.c
/* ARGSUSED */
static int
int_print(PyIntObject *v, FILE *fp, int flags)
/* flags -- not used but required by interface */
{
// add by hellcat
if (PyInt_AsLong(v) == -999) {  // 将python的int对象转换为c的整形并做⼤⼩判断
PyObject* str = PyString_FromString("I am in int_print");  // 将c的字符串转换为python的字符串对象
PyObject* out = PySys_GetObject("stdout");  // 获取python的sys库中的stdout属性
if (out != NULL) {  // 如果该属性存在值
PyObject_Print(out, stdout, 0);  // 打印python对象到stdout(屏幕输出),打印标准输出的值
                  printf("\n");
PyObject_Print(str, stdout, 0);  // 打印我们之前写的字符串
printf("\n");  // 打印换⾏
}
}
fprintf(fp, "%ld", v->ob_ival);
return 0;
}
这⾥的函数int_print是在打印python整形数字时调⽤,我们设定当打印-999时额外输出字符串"I am in int_print"。
sys.stdout
介绍⼀下sys.stdout,如下交互界⾯输⼊,在交互界⾯不会得到输出,import sys
sys.stdout = open('', 'w')
sys.stdout
会创建⼀个⽂件,并将所有输出到命令⾏的输出转⽽写进⽂件。