『Python』源码解析_源码文件介绍

本篇代码针对2.X版本,与3.X版本细节不尽相同,因为二者架构差异不大加之本人能力有限,因此就使用2.X体验python的底层原理了。python

1、主要文件夹内容

Include :该目录下包含了Python提供的全部头文件,若是用户须要本身用C或C++来编写自定义模块扩展Python,那么就须要用到这里提供的头文件。数组

Lib :该目录包含了Python自带的全部标准库,Lib中的库都是用Python语言编写的。架构

Modules :该文件夹中包含了全部用C语言编写的模块,好比ramdom,cStringIO等,Modules中的模块是那些对速度要求很是严格的模块。而有一些对速度没有太严格要求的模块,好比os,就是用Python编写,而且放在Lib目录下dom

Parser :Parser目录中包含了Python解释器中的Scanner和Parser部分,即对Python源代码进行词法分析和语法分析的部分。除了这些,Parser目录下还包含了一些有用的工具,这些工具可以根据Python语言的语法自动生成Python语言的词法和语法分析器,与YACC很是相似。函数

Objects :该目录中包含了全部Python的内建对象,包括整数,list,dict等;同时,该目录还包括了Python在运行时须要的全部的内部使用对象的实现工具

Python :该目录下包含了Python解释器中的Compiler和执行引擎部分,是Python运行的核心所在。ui

PCBuild :包含了Visual Studio 2003工程文件,研究Python源代码就从这里开始,实际使用中我使用的是VS 2015。spa

2、几个标准函数

一、输出python对象的接口函数命令行

python/外部依赖项/object.h/对象

PyAPI_FUNC(int) PyObject_Print(PyObject *, FILE *, int);

二、从C的原生字符数组建立出Python字符串对象

PyObject* str = PyString_FromString("I am in int_print");

三、将Python的整数对象转化为C中的int型

PyInt_AsLong(v)

四、获取Python中sys对象(获取形式采起对象的字符串)

PyObject* out = PySys_GetObject("stdout"); 

3、修改源码示意

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('123.txt', 'w')
sys.stdout

 会建立一个123.txt文件,并将全部输出到命令行的输出转而写进文件。

相关文章
相关标签/搜索