一、Python解釋器
我們編寫的Python代碼都要放在Python解釋器上運(yùn)行,解釋器是代碼與計(jì)算機(jī)硬件之間的軟件邏輯層。
當(dāng)我們?cè)诓僮飨到y(tǒng)上安裝好Python之后,它就包含了保證Python運(yùn)行的最小化組件:解釋器 和 標(biāo)準(zhǔn)庫。根據(jù)選用的Python版本的不同,解釋器本身可以用C語言實(shí)現(xiàn)(Python的官方實(shí)現(xiàn)版本)、Java語言實(shí)現(xiàn)或者其他的形式。無論使用采用什么版本,編寫好的Python程序代碼必須放在解釋器中運(yùn)行。
1、Python代碼的執(zhí)行過程
將我們編寫好的Python代碼放到解釋器中運(yùn)行,此過程主要分為兩步,第一步是將源碼編譯成“字節(jié)碼”,第二步是將編譯好的字節(jié)碼轉(zhuǎn)發(fā)到Python“虛擬機(jī)”中運(yùn)行。當(dāng)然對(duì)于程序員來說,這兩步都是隱藏的。
(1)字節(jié)碼編譯
當(dāng)我們運(yùn)行Python代碼時(shí),Python解釋器內(nèi)部會(huì)先通過詞法分析器將文件中的每一條代碼語句分解為單一步驟,然后編譯成字節(jié)碼的形式。編譯只是一個(gè)簡(jiǎn)單的翻譯步驟,而且字節(jié)碼是屬于源代碼層次范圍內(nèi)的底層代碼,是與平臺(tái)無關(guān)的,所以編譯好的字節(jié)碼是可以跨平臺(tái)運(yùn)行的。這些字節(jié)碼可以提高執(zhí)行速度,比起原始的源代碼語句,字節(jié)碼的運(yùn)行速度要快很多。
如果Python進(jìn)程在機(jī)器上擁有寫入權(quán)限,那么它將把編譯好的字節(jié)碼保存為一個(gè)以 .pyc 為擴(kuò)展名的文件。Python這樣做是作為一種啟動(dòng)速度的優(yōu)化,下一次運(yùn)行程序的時(shí)候,如果你在上次保存字節(jié)碼之后沒有修改過源代碼,Python將會(huì)直接加載 .pyc文件,并跳過編譯這個(gè)步驟。如果你修改了源代碼,下次運(yùn)行程序時(shí),字節(jié)碼文件將自動(dòng)重新創(chuàng)建。
(2)Python虛擬機(jī)(PVM)
當(dāng)源文件編譯成字節(jié)碼,字節(jié)碼就會(huì)發(fā)送到Python虛擬機(jī)(PVM)上來執(zhí)行。事實(shí)上,PVM就是迭代運(yùn)行字節(jié)碼指令的一個(gè)大循環(huán),一個(gè)接一個(gè)的完成操作。從技術(shù)上講,這是Python解釋器的最后一步。
相關(guān)的性能問題
和C/C++這類完全編譯語言相比,Python的工作中沒有 “build” 和 “make” 操作,也就是沒有將源碼編譯成可以直接在機(jī)器上運(yùn)行的二進(jìn)制代碼的過程。而且Python解釋器中間形成的字節(jié)碼并不是CPU可以直接運(yùn)行的二進(jìn)制代碼,PVM仍然需要解釋字節(jié)碼成為二進(jìn)制碼,再交由CPU運(yùn)行。所以Python代碼無法運(yùn)行的像C/C++一樣快。
相關(guān)的開發(fā)意義
在程序開始執(zhí)行之前不需要預(yù)編譯和連接,只需要簡(jiǎn)單的輸入并運(yùn)行代碼即可,這使得開發(fā)周期大大縮短。這同樣使得Python具有更多的動(dòng)態(tài)語言特性:在運(yùn)行時(shí),Python程序可以去構(gòu)建并執(zhí)行另一個(gè)Python程序,而且往往非常的方便。
2、Python 解釋器的使用方法
有三種不同的辦法來啟動(dòng)Python解釋器。最簡(jiǎn)單的方式就是在命令行中啟動(dòng)Python解釋器的交互模式,每次輸入一行Python 代碼來執(zhí)行。另外一種方法是使用Python解釋器運(yùn)行Python 的代碼文件。最后一種辦法就是使用Python的集成開發(fā)環(huán)境(IDE)運(yùn)行Python,集成開發(fā)環(huán)境通常整合了其他的工具,例如集成的調(diào)試器、文本編輯器、版本控制工具等。
(1)啟動(dòng) Python 解釋器的交互模式
交互模式根據(jù)用戶的輸入來運(yùn)行代碼并輸出相應(yīng)結(jié)果,但是他不會(huì)把代碼保存到一個(gè)文件中。學(xué)習(xí)Python 的最好方法就是在交互式解釋器中練習(xí),在你需要測(cè)試一些模塊時(shí),交互式解釋器也非常有用。
Python 解釋器通常被安裝在Linux系統(tǒng)中的 /usr/local/bin 或者 /usr/bin 目錄下,將安裝目錄包含進(jìn) Linux 的PATH環(huán)境變量中,以確保可以直接通過輸入 python 命令來啟動(dòng)它。Python解釋器從命令行讀取命令時(shí),我們稱解釋器工作于 交互模式。這種模式下它根據(jù) 主提示符 來執(zhí)行,主提示符通常標(biāo)識(shí)為三個(gè)大于號(hào)(>>>);繼續(xù)的部分被稱為 從屬(次)提示符,由三個(gè)點(diǎn)標(biāo)識(shí) (...) (一般環(huán)境下可能不顯示)。在第一行之前,解釋器打印歡迎信息、版本號(hào)和授權(quán)提示。輸入多行結(jié)構(gòu)時(shí)需要從屬提示符。
例如,下面這個(gè) if 語句:在交互模式下只能輸入Python代碼,而不能輸入系統(tǒng)的命令。你必須運(yùn)行完一條語句,然后才能輸入另一條語句。對(duì)于簡(jiǎn)單語句來說,只要按下Enter鍵就可以運(yùn)行輸入的語句,對(duì)于復(fù)合語句,必須多提交一個(gè)空行來結(jié)束該語句。要告訴交互模式下的解釋器已經(jīng)輸入完了多行語句,必須要插入一個(gè)空行,也就是說你必須按下Enter鍵兩次,才能運(yùn)行一條復(fù)合語句。
通常你可以在交互式解釋器的主窗口中輸入一個(gè)文件結(jié)束符(Linux系統(tǒng)是 Ctrl + D,Windows 系統(tǒng)是 Ctrl + Z)讓解釋器以 0 狀態(tài)碼退出。或者,你可以通過輸入 quit() 命令退出解釋器。
(2)使用解釋器運(yùn)行Python文件
Python 解釋器有些操作類似 Linux shell,當(dāng)在shell中直接調(diào)用解釋器時(shí)為交互模式(以stdin作為標(biāo)準(zhǔn)輸入),它交互的解釋并執(zhí)行命令;當(dāng)使用文件名作為參數(shù)或以文件作為標(biāo)準(zhǔn)輸入調(diào)用解釋器時(shí),它讀取文件并將文件作為腳本執(zhí)行。啟動(dòng) Python 解釋器還可以使用 python -c command [arg] ...,這種方法可以在 命令行 執(zhí)行 Python 語句,類似于 shell 中的 -c 選項(xiàng)。由于 Python 語句通常會(huì)包含空格或其他特殊 shell 字符,一般建議將 命令 用單引號(hào)包裹起來。
有一些 Python 模塊也可以當(dāng)作腳本使用。你可以使用 python -m module [arg] ... 命令調(diào)用它們,這類似在命令行中鍵入完整的路徑名來執(zhí)行 模塊 源文件一樣。
使用腳本文件時(shí),經(jīng)常會(huì)運(yùn)行腳本然后進(jìn)入交互模式。這也可以通過在腳本之前加上 -i 參數(shù)來實(shí)現(xiàn)。
調(diào)用解釋器時(shí),腳本名和附加參數(shù)會(huì)傳入到一個(gè)名為 sys.argv 的字符串列表。通過導(dǎo)入 sys 模塊,執(zhí)行 sys.argv[0],sys.argv[1]... 獲取這個(gè)列表中的元素。列表的長度大于等于1,沒有給定腳本和參數(shù)時(shí),它至少也有一個(gè)元素:sys.argv[0] ,此時(shí)他為空字符串。
腳本名指定為 '-' (表示標(biāo)準(zhǔn)輸入)時(shí), sys.argv[0] 被設(shè)定為 '-';使用 -c 指令 時(shí), sys.argv[0] 被設(shè)定為 '-c';使用 -m 模塊 參數(shù)時(shí),sys.argv[0]被設(shè)定為指定模塊的全名 -c指令 或者 -m 模塊 之后的參數(shù)不會(huì)被 Python 解釋器的選項(xiàng)處理機(jī)制所截獲,而是留在 sys.argv 中,供腳本命令操作。
Python命令選項(xiàng):
(3)使用 PythonIDE(pycharm)編輯Python文件
Python的IDE使用方式和其他語言并無大的區(qū)別,這里我們通常使用pycharm軟件在windows系統(tǒng)下開發(fā)Python程序。
由于Python是可以跨平臺(tái)運(yùn)行的(Python文件直接運(yùn)行在虛擬機(jī)上,不用關(guān)心具體硬件和操作系統(tǒng)),所以通常我們?cè)赪indows環(huán)境下開發(fā)的腳本可以直接運(yùn)行在Linux環(huán)境下。對(duì)于在Linux環(huán)境下開發(fā)的大型項(xiàng)目或使用框架開發(fā)的項(xiàng)目,可能需要在Linux環(huán)境下運(yùn)行項(xiàng)目而且可能有很多的環(huán)境依賴。這時(shí)我們甚至可以配置pycharm直接同步服務(wù)器端的代碼到本地,還可以配置使用服務(wù)器端的開發(fā)環(huán)境,在本地直接執(zhí)行遠(yuǎn)端服務(wù)器的運(yùn)行命令,并將遠(yuǎn)端的運(yùn)行結(jié)果同步回本地。
關(guān)于pycharm軟件的使用我們會(huì)專門出一節(jié)教程。
《Python基礎(chǔ)手冊(cè)》系列:
Python基礎(chǔ)手冊(cè) 1 —— Python語言介紹
Python基礎(chǔ)手冊(cè) 2 —— Python 環(huán)境搭建(Linux)
Python基礎(chǔ)手冊(cè) 3 —— Python解釋器
Python基礎(chǔ)手冊(cè) 4 —— 文本結(jié)構(gòu)
Python基礎(chǔ)手冊(cè) 5 —— 標(biāo)識(shí)符和關(guān)鍵字
Python基礎(chǔ)手冊(cè) 6 —— 操作符
Python基礎(chǔ)手冊(cè) 7 —— 內(nèi)建函數(shù)
Python基礎(chǔ)手冊(cè) 8 —— Python對(duì)象
Python基礎(chǔ)手冊(cè) 9 —— 數(shù)字類型
Python基礎(chǔ)手冊(cè)10 —— 序列(字符串)
Python基礎(chǔ)手冊(cè)11 —— 序列(元組&列表)
Python基礎(chǔ)手冊(cè)12 —— 序列(類型操作)
Python基礎(chǔ)手冊(cè)13 —— 映射(字典)
Python基礎(chǔ)手冊(cè)14 —— 集合
Python基礎(chǔ)手冊(cè)15 —— 解析
Python基礎(chǔ)手冊(cè)16 —— 文件
Python基礎(chǔ)手冊(cè)17 —— 簡(jiǎn)單語句
Python基礎(chǔ)手冊(cè)18 —— 復(fù)合語句(流程控制語句)
Python基礎(chǔ)手冊(cè)19 —— 迭代器
Python基礎(chǔ)手冊(cè)20 —— 生成器
Python基礎(chǔ)手冊(cè)21 —— 函數(shù)的定義
Python基礎(chǔ)手冊(cè)22 —— 函數(shù)的參數(shù)
Python基礎(chǔ)手冊(cè)23 —— 函數(shù)的調(diào)用
Python基礎(chǔ)手冊(cè)24 —— 函數(shù)中變量的作用域
Python基礎(chǔ)手冊(cè)25 —— 裝飾器
Python基礎(chǔ)手冊(cè)26 —— 錯(cuò)誤 & 異常
Python基礎(chǔ)手冊(cè)27 —— 模塊
Python基礎(chǔ)手冊(cè)28 —— 模塊的高級(jí)概念
Python基礎(chǔ)手冊(cè)29 —— 包