### 2. Python 解釋器
### 2.1 調用解釋器
在可用的機器上,Python解釋器通常安裝成/usr/local/bin/python;請將/usr/local/bin放在您的Unix shell搜索路徑,以使得可以通過在shell中鍵入命令
~~~
python
~~~
來啟動它。由于解釋器放置的目錄是一個安裝選項,其它地方也是可能的;請與您本地的Python專家或系統管理員聯系。(例如,/usr/local/python是另外一個常見的位置。)
在Windows機器上,Python的安裝通常放在C:\Python27,當然你可以在運行安裝程序時進行更改。你可以在一個DOS窗口的命令提示符下鍵入以下命令來把這個目錄添加到路徑中:
~~~
set path=%path%;C:\python27
~~~
主提示符下鍵入文件結束字符(Unix上是Control-D、Windows上是Control-Z)會導致解釋器以0退出狀態退出。如果無法正常工作,您可以通過鍵入以下命令退出解釋器:quit()。
解釋器的行編輯功能通常不是很復雜。在Unix上,不管是誰安裝的,解釋器可能已啟用對GNU readline庫的支持,該庫添加了更詳細的交互式編輯和歷史記錄功能。檢查是否支持命令行編輯的最快的方式也許是對你的第一個Python提示符鍵入Control-P。如果它發出蜂鳴聲,則有命令行編輯;請參閱附錄[*交互式輸入編輯和歷史替代*](#)的有關快捷鍵的介紹。如果什么都沒發生,或者顯示^P,則命令行編輯不可用;你就只能夠使用退格鍵刪除當前行中的字符。
解釋器有些像Unix shell:當調用時使用連接到一個tty設備作為標準輸入,它交互地讀取并執行命令;當用文件名參數或文件作為標準輸入調用,它將讀取并執行該文件中的*腳本*。
第二種啟動解釋器的方式是python-ccommand[arg]...,它會執行*command*中的語句,類似于shell的[*-c*](#)選項。因為Python語句經常包含空格或其他shell特殊字符,通常建議把全部*command*放在單引號里。
有些Python模塊也是可執行的腳本。這些模塊可以使用python-mmodule[arg]...直接調用,這和在命令行輸入完整的路徑名執行*module*的源文件是一樣的。
有時使用一個腳本文件,能夠在運行該腳本之后進入交互模式非常有用。這可以通過在腳本前面加上[*-i*](#)選項實現。
#### 2.1.1. 參數傳遞
調用解釋器時,腳本名稱和其他參數被轉換成一個字符串列表并賦值給sys模塊中的argv變量。你可以通過importsys訪問此列表。列表的長度是至少是1;如果沒有給出腳本和參數,sys.argv[0]是一個空字符串。當使用[*-c*](#)*command*時,sys.argv[0]被設置為'-c'。當使用[*-m*](#)*module*時,sys.argv[0]被設定為指定模塊的全名。[*-c*](#)*command*或[*-m*](#)*module*后面的選項不會被Python解釋器的選項處理機制解析,而是被保存在sys.argv中,供命令或模塊使用。
#### 2.1.2. 交互模式
當命令從tty讀取時,就說解釋器在*交互模式*下。這種模式下解釋器以*主提示符*提示下一個命令,主提示符通常為三個大于號(>>>);對于續行解釋器以*從提示符*提示,默認為三個點(...)。在第一個提示符之前,解釋器會打印出一條歡迎信息聲明它的版本號和授權公告:
~~~
python
Python 2.7 (#1, Feb 28 2010, 00:02:06)
Type "help", "copyright", "credits" or "license" for more information.
>>>
~~~
輸入多行結構時需要續行。作為一個例子,看看這個[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. 錯誤處理
錯誤發生時,解釋器會打印錯誤信息和堆棧跟蹤信息。在交互模式下,它會返回到主提示符;當輸入來自一個文件,它會打印堆棧跟蹤信息,然后以非零退出狀態退出。(由[try](#)語句中的[except](#)子句處理的異常不是這方面的錯誤)。有些錯誤是致命的并導致非零狀態退出;這通常由于內部不一致和某些情況下的內存不足導致。所有錯誤消息都寫入標準錯誤流;執行命令的普通輸出寫入標準輸出。
在主提示符或從提示符后輸入中斷符(通常為Control-C或DEL)可以取消輸入,并返回到主提示符。[[1]](#)命令執行過程中輸入中斷符將引發[KeyboardInterrupt](# "exceptions.KeyboardInterrupt")異常,它可以被[try](#)語句截獲。
#### 2.2.2. 可執行的Python腳本
在類BSD的Unix系統上,可以將Python腳本變成可直接執行的,就像shell腳本一樣,通過放置一行
~~~
#! /usr/bin/env python
~~~
(假定解釋器在用戶的PATH中)在腳本的開始并且給文件可執行的模式。#!必須是文件最開始的兩個字符。在一些平臺上,第一行必須以一個Unix風格的行結束符('\n')結束,不能是Windows的行結束符('\r\n')。注意,字符'#'在Python中用于起始一個注釋。
通過**chmod**命令可以給予腳本可執行的模式或權限:
~~~
$ chmod +x myscript.py
~~~
在Windows系統上,沒有"可執行模式"的概念。Python安裝程序會自動將.py文件與python.exe關聯,雙擊Python文件將以腳本的方式運行它。擴展名也可以是.pyw,在這種情況下,通常出現的控制臺窗口不會再顯示了。
#### 2.2.3. 源程序的編碼
在Python源文件中可以使用非ASCII編碼。最好的方法是在#!行的后面再增加一行特殊的注釋來定義源文件的編碼:
~~~
# -*- coding: encoding -*-
~~~
通過此聲明,源文件中的所有字符將被視為由*encoding*編碼,并且可以直接寫由選中的編碼方式編碼的Unicode字符串字面量。在Python庫參考手冊的[codecs](# "codecs: Encode and decode data and streams.")小節中,可以找到所有可能的編碼方式列表。
例如,若要寫入包含歐元貨幣符號的 Unicode 字面量,可以使用ISO-8859-15 編碼,其歐元符號的值為164 。此腳本中,以 ISO-8859-15 編碼,保存時將打印的值 8364 (Unicode 代碼點相應的歐元符號),然后退出:
~~~
# -*- coding: iso-8859-15 -*-
currency = u"€"
print ord(currency)
~~~
如果你的編輯器支持保存為帶有UTF-8*字節順序標記*(也叫做BOM) 的UTF-8格式的文件,你可以使用這種功能而不用編碼聲明。IDLE如果設置了Options/General/Default Source Encoding/UTF-8 也支持此功能。注意,這種標記方法在舊的Python 版本中(2.2 及更早)是不能識別的,同樣也不能被能夠處理#!(只在Unix系統上使用)行的操作系統識別。
通過使用 UTF-8 編碼(無論是BOM方式或者是編碼聲明方式),世界上大多數語言的字符可以在字符串字面量和注釋中同時使用。在標識符中使用非 ASCII 字符是不支持的。若要正確顯示所有這些字符,您的編輯器必須認識該文件是 UTF-8 編碼,并且它必須使用支持文件中所有字符的字體。
#### 2.2.4. 交互式啟動文件
當您以交互方式使用Python時,讓解釋器在每次啟動時執行一些標準命令會變得非常方便。你可以通過設置環境變量[PYTHONSTARTUP](#)為包含你的啟動命令的文件的名字。這類似于Unix shell的.profile功能。
這個文件只會在交互式會話時讀取,當 Python 從腳本中讀取命令時不會讀取,當/dev/tty 在命令中明確指明時也不會讀取 (盡管這種方式很像是交互方式)。它和交互式命令在相同的命名空間中執行,所以在交互式會話中,由它定義或引用的一切可以在解釋器中不受限制地使用。您還可以在此文件中更改sys.ps1和sys.ps2 的提示符。
如果您想要從當前目錄讀取額外的啟動文件,你可以在全局啟動文件中使用這樣的代碼 ifos.path.isfile('.pythonrc.py'):execfile('.pythonrc.py')。如果你想要在腳本中使用啟動文件,必須要在腳本中明確地寫出:
~~~
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
execfile(filename)
~~~
#### 2.2.5. 自定義模塊
Python提供了兩個鉤子來定制化它:sitecustomize和usercustomize。要查看它如何工作,你首先需要找到你的用戶site-packages目錄。啟動Python并運行下面的代碼:
~~~
>>> import site
>>> site.getusersitepackages()
'/home/user/.local/lib/python2.7/site-packages'
~~~
現在你可以在此目錄下創建名為usercustomize.py的文件,并把任何你想要的東西放在里面。它將影響每個Python調用,除非啟動時用[*-s*](#)選項來禁用自動導入。
sitecustomize的工作方式相同,但通常是由計算機的管理員在全局site-packages目錄中創建,并在usercustomize之前導入。更多詳細信息請參閱[site](# "site: Module responsible for site-specific configuration.")模塊的文檔。
腳注
| [[1]](#) | GNU Readline庫的一個問題可能導致它不會發生。 |
|-----|-----|
- Python 2 教程
- 1. 吊吊你的胃口
- 2. Python 解釋器
- 3. Python簡介
- 4. 控制流
- 5. 數據結構
- 6. 模塊
- 7. 輸入和輸出
- 8. 錯誤和異常
- 9. 類
- 10. 標準庫概覽
- 11. 標準庫概覽 — 第II部分
- 12.現在怎么辦?
- 13. 交互式輸入的編輯和歷史記錄
- 14. 浮點數運算:問題和局限
- Python 2 標準庫
- 1. 引言
- 2. 內建函數
- 3. 不太重要的內建函數
- 4. 內建的常量
- 5. 內建的類型
- 6. 內建的異常
- 7. String Services
- 8. Data Types
- 9. Numeric and Mathematical Modules
- 10. File and Directory Access
- 11. Data Persistence
- 13. File Formats
- 14. Cryptographic Services
- 15. Generic Operating System Services
- 16. Optional Operating System Services
- 17. Interprocess Communication and Networking
- 18. Internet Data Handling
- 20. Internet Protocols and Support
- 26. Debugging and Profiling
- 28. Python Runtime Services
- Python 2 語言參考
- 1. 簡介
- 2. 詞法分析
- 3. 數據模型
- 4. 執行模型
- 5. 表達式
- 6. 簡單語句
- 7. 復合語句
- 8. 頂層的組件
- 9. 完整的語法規范
- Python 3 教程
- 1. 引言
- 2. Python 解釋器
- 3. Python簡介
- 4. 控制流
- 5. 數據結構
- 6. 模塊
- 7. 輸入和輸出
- 8. 錯誤和異常
- 9. 類
- 10. 標準庫概覽
- 11. 標準庫概覽 — 第II部分
- 12.現在怎么辦?
- 13. 交互式輸入的編輯和歷史記錄
- 14. 浮點數運算:問題和局限