python如何執行程式--------基礎篇之一
python執行機制
python作為一種動態語言,其實是一個直譯器軟體包。當Python執行指令碼時,在程式碼開始進行處理之前,Python還會執行一些步驟。第一步是編譯成所謂的“位元組碼”,如果Python程序擁有寫入許可權,將把程式的位元組碼儲存為一個以.pyc為副檔名的檔案, 如果Python無法在機器上寫入位元組碼,程式仍然可以工作:位元組碼將會在記憶體中生成並在程式結束時簡單地丟棄。一旦程式編譯成位元組碼(或位元組碼從已經存在的.pyc檔案中載入),之後的位元組碼傳送到通常稱為Python虛擬機器(Python VirtualMachine,簡寫為PVM)上來執行。PVM不是一個獨立的程式,是Python的執行引擎,不需要安裝。事實上PVM就是迭代執行位元組碼指令的一個大迴圈,一個接一個地完成操作。
因此Python具有更多的動態語言特性:在執行時,Python程式去構建並執行另一個Python程式是有可能的,而且往往是非常方便的。例如,eval和exec內建模組,能夠接受並執行包含Python程式程式碼的字串。使用如下程式碼可以檢視add函式的位元組碼:
import dis def add(a,b): sum=a+b return sum print(dis.dis(add))View Code
主要的python直譯器
CPython
當我們從Python官方網站下載並安裝好Python 3.x後,我們就直接獲得了一個官方版本的直譯器:CPython。這個直譯器是用C語言開發的,所以叫CPython。在命令列下執行python
IPython
IPython是基於CPython之上的一個互動式直譯器,也就是說,IPython只是在互動方式上有所增強,但是執行Python程式碼的功能和CPython是完全一樣的。好比很多國產瀏覽器雖然外觀不同,但核心其實都是呼叫了IE。CPython用>>>
作為提示符,而IPython用In [序號]:
作為提示符。
PyPy
PyPy是另一個Python直譯器,它的目標是執行速度。PyPy採用JIT技術,對Python程式碼進行動態編譯(注意不是解釋),所以可以顯著提高Python程式碼的執行速度。
絕大部分Python程式碼都可以在PyPy下執行,但是PyPy和CPython有一些是不同的,這就導致相同的Python程式碼在兩種直譯器下執行可能會有不同的結果。
Jython
Jython是執行在Java平臺上的Python直譯器,可以直接把Python程式碼編譯成Java位元組碼執行。Jython指令碼可以應用於開發Web applet和servlet,建立基於Java的GUI。此外,Jython具有整合支援的功能,允許匯入Python程式碼或使用Java的類。因為Jython要比CPython慢而且也不夠健壯,它往往看做是一個主要面向尋找Java程式碼前端指令碼語言的Java開發者的一個有趣的工具。
IronPython
IronPython和Jython類似,只不過IronPython是執行在微軟.Net平臺上的Python直譯器,可以直接把Python程式碼編譯成.Net的位元組碼。
生成獨立執行程式
藉助一些第三方工具Python程式可以生成獨立的可執行二進位制程式碼檔案進行分發。這些第三方工具能夠將程式的位元組碼、PVM(直譯器)以及任何程式所需要的Python支援檔案捆綁在一起形成一個單獨的檔案。,主要有三種工具:py2exe(Windows下使用)、PyInstaller(和py2exe類似,它能夠在Linux及UNIX上使用,並且能夠生成自安裝的獨立執行程式)以及freeze(最初始的版本)。你可以單獨獲得這些工具,它們也是免費的。它們處在持續的開發過程中,請參考http://www.python.org以及Vaults of Parnassus網站(http://www.vex.net/parnassus/)以便獲得有關這些工具的更多資訊。