從源碼編譯 Python

嘗試經過源碼本身編譯 Python,使用的系統是 Ubuntu14.04 LTS。python

屏幕快照 2016-07-08 15.21.00.png

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

 

1code

tar -zxvf Python-2.7.12.tgz對象

能夠看到目錄結構以下:get

 

1源碼

2編譯

3table

4變量

5object

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

.

├── aclocal.m4

├── config.guess

├── config.sub

├── configure

├── configure.ac

├── Demo

├── Doc

├── Grammar

├── Include

├── install-sh

├── Lib

├── LICENSE

├── Mac

├── Makefile.pre.in

├── Misc

├── Modules

├── Objects

├── Parser

├── PC

├── PCbuild

├── pyconfig.h.in

├── Python

├── README

├── RISCOS

├── setup.py

└── Tools

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

  • 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 行,以下:

 

1

2

3

4

5

6

7

8

static int

bool_print(PyBoolObject *self, FILE *fp, int flags)

{

    Py_BEGIN_ALLOW_THREADS

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

    Py_END_ALLOW_THREADS

    return 0;

}

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

 

1

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

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

 

1

2

3

./configure --prefix=/path/u/what/to/install

make

make install

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

 

1

2

3

4

5

.

├── bin

├── include

├── lib

└── share

想要運行的話,執行 bin/python 便可,你也能夠將其加入到 PATH 中,不過仍是不建議去搞亂系統那個。好了,用咱們本身編譯的解釋器執行幾條語句吧:

 

1

2

3

4

5

6

7

8

9

10

11

>>> print True

False

 

>>> print False

True

 

>>> print 3 > 5      

True

 

>>> print 1 == 2

True

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

相關文章
相關標籤/搜索