從源碼編譯 Python

(你也可以在我的博客閱讀這篇文章)

嘗試通過源碼自己編譯 Python,使用的系統是 Ubuntu14.04 LTS。

首先去官網下載源碼,地址:源碼下載。下載完成之後,解壓源碼:

tar -zxvf Python-2.7.12.tgzn

可以看到目錄結構如下:

.n├── aclocal.m4n├── config.guessn├── config.subn├── configuren├── configure.acn├── Demon├── Docn├── Grammarn├── Includen├── install-shn├── Libn├── LICENSEn├── Macn├── Makefile.pre.inn├── Miscn├── Modulesn├── Objectsn├── Parsern├── PCn├── PCbuildn├── pyconfig.h.inn├── Pythonn├── READMEn├── RISCOSn├── setup.pyn└── Toolsn

其中,我們比較關注的幾個目錄是:

  • Include: 這個目錄包括了 Python 的所有頭文件。
  • Lib:這裡是 Python 標準庫,都是用 Python 實現的。
  • Modules:用 C 語言編寫的模塊,比如 cStringIO / tkinter 等。
  • Objects:Python 內建對象,如 int / list 等。
  • Python:Python 解釋器的 Compiler 和執行引擎。
  • Parser:Python 解釋器的 Scanner 和 Parser。

我並不只是想嘗試簡單的通過源碼編譯安裝,那麼,在編譯之前,我們先對它做一點小小的改動吧。今天先不做太複雜的事情,嘗試一下「顛倒黑白」吧。所謂顛倒黑白,就是在輸出(只有輸出時)bool 型變數時,將 True/False 對調。關於輸出 bool 變數的 C 語言實現,在 Objects/boolobject.c 的第 7-14 行,如下:

static intnbool_print(PyBoolObject *self, FILE *fp, int flags)n{n Py_BEGIN_ALLOW_THREADSn fputs(self->ob_ival == 0 ? "False" : "True", fp);n Py_END_ALLOW_THREADSn return 0;n} n

可以看出,對於輸出 True 還是 False 的判斷是用三元運算符 self->ob_ival == 0 ? "False" : "True",那麼,其實改動就非常容易了:

fputs(self->ob_ival != 0 ? "False" : "True", fp);n

將比較運算符做一點小改動,就「顛倒黑白」啦。然後執行:

./configure --prefix=/path/u/what/to/installnmakenmake installn

第一條命令的 --prefix= 後面是你想要安裝的位置,你可以自行調整。等待運行完畢,就安裝好啦,進入指定的目錄,目錄結構如下:

.n├── binn├── includen├── libn└── sharen

想要運行的話,執行 bin/python 即可,你也可以將其加入到 PATH 中,不過還是不建議去搞亂系統那個。好了,用我們自己編譯的解釋器執行幾條語句吧:

>>> print TruenFalsenn>>> print FalsenTruenn>>> print 3 > 5 nTruenn>>> print 1 == 2nTruen

很明顯,已經「顛倒黑白」啦。

推薦閱讀:

Python 初學者想通過 Django 框架寫一個博客,一個月內完成任務,大致的學習路線怎麼安排?
如何去尋找網路爬蟲的需求?
深度學習基礎之Numpy教程
Python-Excel 模塊哪家強?
10道Python小題

TAG:Python | 源码阅读 |