小段落

- 2.1 如何啟動直譯器
  - 2.1.1 參數的傳遞
  - 2.1.2 互動模式
- 2.2 直譯器及其周邊環境
  - 2.2.1 程式錯誤處理
  - 2.2.2 執行Python腳本(Script)
  - 2.2.3 互動式啟動檔(startup file)

#
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.ps1` 及 `sys.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的問題可能會使這個功能失效。

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