本篇代碼針對2.X版本,與3.X版本細節不盡相同,因爲二者架構差異不大加之本人能力有限,因此就使用2.X體驗python的底層原理了。python
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
一、輸出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");
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,以下交互界面輸入,在交互界面不會獲得輸出,
import sys sys.stdout = open('123.txt', 'w') sys.stdout
會建立一個123.txt文件,並將全部輸出到命令行的輸出轉而寫進文件。