小段落


2. 使用Python的直譯器


2.1 如何啟動直譯器

在Unix之類的作業系統上,如果有安裝的話,Python直譯器通常安裝在 /usr/local/bin/python 這個目錄中。你可能需要先在Shell中設定尋找 /usr/local/bin 目錄,這樣你才可以在Shell中打入以下的指令來啟動Python直譯器

python

你的Python直譯器安裝的位置是可以在安裝時設定的,因此也有可能安裝在其他的地方。你也許需要問你週遭的Python大師或是系統管理員才能知道正確的安裝位置( /usr/local/python 是另外一個普遍的可能安裝所在)。

要離開Python直譯器的話,打入EOF的字元( 在Unix上是 Control-D ,在DOS及Windows上是 Control-Z 就會使得直譯器離開(zero exit status)。如果行不通的話,你可以打入以下指令離開直譯器: "import sys; sys.exit()".

Python直譯器使用每行編輯,應該不難使用。在Unix上,也許安裝Python直譯器的人有安裝使用GNU readline程式庫的功能,這樣的話你會有互動式編輯以及編輯過去資料的功能。最簡單的檢查你有沒有這項功能的方法就是在Python的提示之下打入Control-P ,如果有嗶聲的話,就表示你有這項功能,你可以翻到 附錄 A 去看特殊鍵的用法。如果你沒有聽到嗶聲,或是只出現 P 的話,就表示你沒有這項功能,你得使用倒退鍵(backspace)來清除目前所在行的字元了。

Python直譯器的操作方法根Unix shell很像:當被呼叫時所連結的標準輸入是tty device(終端機)的話,直譯器會互動的讀及執行所輸入的指令。當被呼叫時加入檔案名稱參數或所連結的標準輸入是連到檔案的話,直譯器就會讀入並執行該檔所含有的 script

第三種啟動直譯器的方法是打入以下的指令 "python -c command [arg] ..." ,這個指令會執行 command 所代表的敘述(這跟shell的 -c option很像),因為Python敘述(statement)常有空白及特殊字元,所以用此法時可以把 command 所代表的敘述用””括起來,以免跟shell的其他特殊字元或是參數有所混淆。

要注意的是 "python file" 指令跟 "python <file"指令是有所區分的。對後者而言,不單單只有執行這個script,而且程式中有關輸入的需求(例如呼叫 input() 或是 raw_input() ) 也都會由這個 file 來滿足。由於此file已經在程式執行之初已經被從頭到尾讀過一次,所以一執行這個程式將會馬上就碰到了EOF。相反的對於前一個寫法來說,程式的輸入需求是由任何連結到Python直譯器的標準輸入(standard input)的裝置或檔案來滿足的,而這個也許才是你所想要的結果。

當script檔案在使用的時候,也許你會想要執行這個script然後還可以之後繼續進入互動的模式。這時你可以加入 -i 這個選項。但是如同前一段所說的,如果此script是由標準輸入來讀進去的話就沒有辦法這樣做了。


2.1.1 參數的傳遞

如果interpreter認識sys的話(譯:可用“import sys”指令),script的檔案名及附加傳入的參數都會被紀錄在 sys.argv 這個變數並並傳給script來使用。sys.argv 是一列的字串,長度至少為1,如果你什麼都檔案或參數都沒傳的話, sys.argv[0] 就是一個空字串。如果script的名字是 '-' (就是標準輸入的意思)的話, sys.argv[0] 就會被設為 '-' 。當使用 -c command 的話, sys.argv[0] 就被設定為 '-c' 所有的在 -c command 之後的option(例如 –i )都會被當成 sys.argv 而被command所處理,所以就不是當作option一樣的來看待了。


2.1.2 互動模式

當指令是由tty終端機來傳入時,我們稱之為互動模式( interactive mode)。在此模式之下會出現主要的命令提示符號( primary prompt)來提示輸入下一個指令,這個primary prompt通常是 "> >" 。如果是指令是延續上一行的話就會出現secondary prompt符號,這個 secondary prompt 就通常是 "... " 。一進入python的互動模式的話直譯器會出現一個歡迎信息,以及版本編號輯版權說明,接下來就是第一個prompt。如下所示:

python
Python 1.5.2b2 (#1, Feb 28 1999, 00:02:06) [GCC 2.8.1] on sunos5
Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam
>>>

當你輸入需要多行的結構時,直譯器就會自動會出現延續上一行的prompt符號,下面的例子是 if 敘述的情況:

>>> the_world_is_flat = 1
>>> if the_world_is_flat:
... print "Be careful not to fall off!"
...
Be careful not to fall off!


2.2 直譯器及其周邊環境


2.2.1 程式錯誤處理

當有錯誤產生時,直譯器就會在螢幕印出錯誤的信息以及stack trace的所有資料。在互動模式之下,印完資料之後會再印出prompt來。如果輸入是來自於檔案的話,在出現錯誤的情況下直譯器在印出stack trace之後程式會以nonzero exit 的狀態結束。(此處討論不包含已經由 try 敘述及 except 子句處理外的狀況(Exceptions))。有些的程式錯誤是沒有辦法挽救並且會造成nonzero exit的結束情況,這常常是內部的不一致或是某種running out of memory所造成。所有的錯誤信息都會被寫入至標準error stream之中,正常的程式執行的輸出則會寫入到標準(standard output)輸出之中。

如果在primary或是secondary prompte之下打入中斷字元(通常是 Control-C 或是 DEL),這會造成輸入的中斷並且會回到prompt之下。 2.1 在指令執行之中打入中斷字元則會引起 KeyboardInterrupt 的exception,而這是可以在 try 敘述中處理的。


2.2.2 執行Python腳本(script)

在BSD之類的Unix 系統上,我們可以在script的最前面加入以下的敘述(類似shell script),並改變檔案屬性為可執行:

#! /usr/bin/env python

如此script就會變成可執行檔,可以直接執行 (假設Python的直譯器是在user的 $PATH) 變數之中) 。 "#!" 這兩個字必須在script檔案的最前面。值得一提的是 "#" 在Python之中也當作注解(comment)部分開始的符號。


2.2.3 互動式啟動檔(startup file)

當你使用互動模式的時候,如果可以在每次直譯器要啟動時先執行一些命令的話將是很有用的。要達成如此功能,你可以設定一個檔案名稱給環境變數 $PYTHONSTARTUP ,這個檔案可以包含你想要在啟動時執行的命令,類似 .profile 在Unix shell中的用法。

這個啟動檔(startup file)只有對在互動模式下有效,如果你用Python讀入script時就沒有用,在當 /dev/tty 是命令的輸入來源也沒有用(其他的情況與互動模式相類似)。這個startup file所執行命令的命名空間是與其他互動模式下輸入的指令相同,所以在startup file內定義或是import的物件,在之後的互動模式指令中都是可以直接使用的。你也可以在這個startup file中改變 sys.ps1sys.ps2 ,如此就可以改變你的primary prompt及secondary prompt。

如果你在你的startup file中想要使用另外的在目前目錄的startup file,你只需要在主要startup file (global start-up file)寫入 "if os.path.isfile('.pythonrc.py'): execfile('.pythonrc.py')" 。如果你想要在你的script之中使用startup file的話,你必須在你的script中寫入:

import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
execfile(filename)



註腳

... 回到prompt之下。 2.1
有一個GNU Readline package的問題可能會使這個功能失效。

請看關於此文件… 裡面有關如何給我們建議的說明。