Python如何運行程序


Python解釋器簡介

解釋器是一種讓其他程序運行起來的程序。Python也有一個名為解釋器的軟件包,當你編寫了一段Python程序,Python解釋器將讀取程序,並按照其中的命令執行,得出結果。實際上,解釋器是代碼與機器的計算機硬件之間的軟件邏輯層。

當Python包安裝在機器上后,它包含了一些最小化的組件:一個解釋器和支持的庫。根據使用情況的不同,Python解釋器可能采取可執行程序的形式,或是作為鏈接到另一個程序的一系列庫。根據選用的Python版本的不同,解釋器本身可以用C程序實現,或一些Java類實現,或者其他形式。無論采用何種形式,編寫的Python代碼必須在解釋器中運行。故,首先要在機器上安裝Python解釋器。

可以根據不同的平台去官網(http://www.python.org)下載獲得對應的Python,安裝即可

程序執行

編寫或運行Python程序的意義是什么呢?這個取決於你是從一個程序員還是Python編譯器的角度去看這個問題。

1、程序員視角

就最簡單的形式而言,一個Python程序僅是一個包含Python代碼的文本文件。下面是一個經典程序:

print('hello world!')
print(2 ** 100)

這個文件包含了兩個Python打印語句,在標准輸出中簡單的打印一個字符串和一個數學表達式的結果(2100)。你可以用任何文本編輯器來建立這樣的文本文件。按照慣例,Python文件是以.py結尾的。從技術上講,這種命名方案在被"導入"時才是必須的,為了統一所有的Python文件都以.py命名。我們在命令行運行這兩行代碼:

也可以將這兩行放到一個文件中,然后去執行這個文件:

Python視角

從程序員視角,我們把Python代碼保存在一個.py文件中,執行這個文件,標准輸出會給我們返回結果。在文件中輸入代碼,在解釋器中執行這些代碼。然而,Python運行時,其實還有一些事情發生。

當Python運行腳本時,在代碼開始進行處理之前,Python還會執行一些步驟。

1、字節碼編譯

程序執行時,Python內部會先將源代碼編譯成字節碼的形式。編譯是一個簡單的翻譯步驟,而且字節碼是源代碼底層的、與平台無關的表現形式。概括來講,就是Python通過把每一條源代碼分解為單一步驟來將這些源語句翻譯成一組字節碼指令。這些字節碼可以提高執行速度。這個過程對於用戶來說是完全隱藏起來的。

如果Python進程在機器上擁有寫入權限,那么它將程序的字節碼保存為一個以.pyc為擴展名的文件。Python這樣保存字節碼是作為一種啟動速度的優化。下一次運行時,如果在上次保存字節碼后沒有修改過源代碼,Python會加載.pyc文件跳過編譯這一步。當Python必須重新編譯時,它會自動檢查源文件和字節碼文件的時間戳。

如果Python無法再機器上寫入字節碼,程序仍然可以工作:字節碼將會在內存中生成並在程序結束時丟棄。

2、Python虛擬機(PVM)

一旦程序編譯成字節碼(或字節碼從已經存在的.pyc文件中載入),之后的字節碼發送到PVM上執行。PVM不是一個獨立的程序,不需要安裝。PVM是迭代運行字節碼指令的一個大循環,一個接一個的完成操作。PVM是便宜Python的運行引擎,表現為Python系統的一部分,並且它是實際運行腳本的組件。技術上講,它才是Python解釋器的最后一步。

Python的傳統運行執行模式:錄入的源代碼轉換為字節碼,之后字節碼在PVM中運行。代碼被自動編譯,解釋

3、性能的含義

熟悉C和C++這類完全編譯語言的話,此時應該已經發現了Python模式中的一些不同之處。其中一個是,在Python的工作中通常沒有"build"或"make"的步驟:代碼在寫好后立即運行。另一個就是Python字節碼不是機器的二進制代碼,只是特定於Python的一種表現形式。這就是Python代碼無法運行的像C或C++代碼一樣快的原因,PVM循環仍然需要解釋字節碼,並且字節碼指令與CPU指令相比需要更多的工作。另一個因素:和其他經典的解釋器不同,這里仍有內部的編譯步驟,Python並不需要反復的重分析和重分解每一行語句。實際的效果就是純Python代碼的運行速度介於傳統的編譯語言和傳統的解釋語言之間。

4、開發的含義

Python執行模塊的另一個情況是其開發和執行的環境實際上沒有區別。也就是說,編譯和執行源碼的系統是同一個系統。這使得開發周期大大縮短。在程序開始執行之前不需要預編譯和連接;只需要簡單地輸入並運行代碼即可。這同樣是Python具有更多的動態語言特性:在運行時,Python程序去構建並執行另一個Python程序是有可能的,而且是非常方便的。eval和exec內置模塊,能夠接受並運行包含Python程序代碼的字符串,這種結構是Python能夠實現產品定制的原因:因為Python代碼可以動態地修改,用戶可以改進系統內部的Python部分,而不需要擁有或編譯整個系統的代碼。

其實只要牢記一點,Python真正擁有的只有運行時,完全不需要初始的編譯階段,所有的東西都是在程序運行時發生的。

執行模塊的變體

前面提到的Python傳統運行執行模式反應了Python的標准實現形式,實際上並不是Python語言本身所必須的。執行模塊在演變。

1、Python實現的替代者

Python語言有三種主要的實現方式:CPython、Jython和IronPython以及一些次要的實現方式,如,Stackless Python。簡單來說,CPyhton是標准的實現,其他的都是由特定目標和角色的。這些東西都是用來實現Python的,只是通過不同的方式執行程序罷了。

2、執行優化工具

CPython、Jython和IronPython都是通過同樣的方式實現Python語言的,即通過把源代碼編譯為字節碼,然后在合適的虛擬機上執行這些字節碼。然而,其他的系統,包括Psyco即時編譯器以及Shedskin C++轉換器,則試着優化了基本執行模塊。

a、Psyco實時編譯器

Psyco系統並不是Python的另一種實現方式,而是一個擴展字節碼執行模塊的組件,可以讓程序運行的更快。Psyco是一個PVM的增強工具,這個工具收集並使用信息,在程序運行時,可以將部分程序的字節碼轉換成底層的真正的二進制機器碼,實現更快的執行速度。在開發過程中,Psyco無需代碼的修改或獨立的編譯即可完成這一轉換。

b、Shedskin C++轉換器

Shedkin是一個引擎系統,它采用了一種不同的Python程序執行方法:它嘗試將Python代碼變成C++代碼,然后使用機器中的C++編譯器將得到的C++代碼編譯為機器代碼

3、凍結二進制文件

有時候人們需要一個"真正的"Python編譯器,實際上他們真正需要的是得到一種能夠讓Python程序生成獨立的可執行二進制代碼的簡單方法。這是一個比執行流程概念更接近於打包分發概念的東西,但是二者之間或多或少有些聯系。通過從網絡上獲得一些第三方工具,將Python程序轉為可執行程序(在Python世界中稱作凍結二進制文件)是有可能的

凍結二進制文件能夠將程序的字節碼、PVM以及任何程序所需要的Python支持文件捆綁在一起形成一個單獨的文件包。過程會有些不同,但實際的結果將會是一個單獨的可執行的二進制程序,這個程序可以很容易地向客戶分發。

現如今,主要有三種系統能夠生成二進制文件:py2exe(Windows下使用)、PyInstaller(和py2exe類似,它能夠在Linux及Unix上使用,並且能夠生成自安裝的二進制文件)以及freeze(最初始的版本)。

凍結二進制文件與真實的輸出結果有所不同:它們通過虛擬機運行字節碼。因此,如果離開了必要的初始改進,凍結二進制文件和最初的源代碼運行速度完全相同。凍結二進制文件並不小(包括PVM),但是以目前的標准來衡量,它們的文件也不是特別大。因為在凍結二進制文件中嵌入了Python,接收端並不需要安裝Python來運行這些文件。此外,由於代碼嵌入在凍結二進制文件中,對於接受者來說,代碼都是隱藏起來的。

對商業軟件的開發者來說,單文件封裝的架構特別有吸引力。

4、其他執行選項:還有一些其他的方案可以用來運行Python程序,可以關注相關的網站來了解它們

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM