『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文件,並將全部輸出到命令行的輸出轉而寫進文件。

相關文章
相關標籤/搜索