### 2. Python 解釋器
### 2.1 調用解釋器
Python 解釋器在可用的機器上通常安裝成/usr/local/bin/python3.4;將/usr/local/bin放在您的 Unix shell 搜索路徑,使得可以通過在shell 中鍵入命令
~~~
python3.4
~~~
來啟動它。[[1]](#)由于解釋器放置的目錄是一個安裝選項,其他地方也是可能的;請與您的 Python 專家或系統管理員聯系。(例如, /usr/local/python是一個常見的替代位置。
在Windows機器上,Python的安裝通常是放置在C:\Python3,當然你可以在運行安裝程序時進行更改。你可以在一個DOS窗口的命令提示符下鍵入以下命令來把這個目錄添加到路徑中:
~~~
set path=%path%;C:\python34
~~~
主提示符下鍵入文件結束字符 ( Unix 上是Control-D 、 Windows 上是Control-Z) 會導致該解釋器以零退出狀態退出。如果無法正常工作,您可以通過鍵入以下命令退出解釋器: quit()。
編輯器的行編輯功能包括交互式編輯,歷史記錄和代碼補全,其中代碼補全功能需要系統支持readline庫。也許最快的檢查,看看是否支持命令行編輯對你的第一個 Python 提示Ctrl-P。如果它發出蜂鳴聲,則有命令行編輯 ;請參閱附錄[*交互式輸入編輯和歷史替代*](#) 的有關快捷鍵的介紹。如果什么都沒發生,或者顯示^ P,命令行編輯不可用 ;你就只能夠使用退格鍵刪除當前行中的字符。
解釋器有些像 Unix shell:當使用tty設備作為標準輸入調用時,它交互地讀取并執行命令 ;當用文件名參數或文件作為標準輸入調用,它將讀取并執行該文件中的*腳本*。
第二種啟動解釋器的方式是python-ccommand[arg]...,這種方式是在*command*中執行語句,類似于 shell 的[*-c*](#)選項中。因為 Python 語句經常包含空格或其他shell 特殊字符,通常建議把全部*命令*放在單引號里。
有些 Python 模塊同時也是可執行的腳本。這些模塊可以使用python-mmodule[arg]......直接調用,這和在命令行輸入完整的路徑名執行*模塊* 的源文件是一樣的。
當使用一個腳本文件時,它有時是很有用能夠運行該腳本,之后進入交互模式。這可以通過在腳本前面加上[*-i*](#) 選項實現。
#### 2.1.1. 參數傳遞
調用解釋器時,腳本名稱和其他參數被轉換成一個字符串列表并賦值給sys模塊中的argv變量。你可以通過importsys訪問此列表。列表的長度是至少是 1 ;如果沒有給出腳本和參數, sys.argv[0]是一個空字符串。當使用[*-c*](#)*命令*時, sys.argv[0]設置為'-c'。當使用[*-m*](#)*模塊參數*時, sys.argv[0]被設定為指定模塊的全名。[*-c*](#)*選項*或[*-m*](#)*選項*后面的選項不會被Python 解釋器處理,但是會被保存在sys.argv中,供命令或模塊使用。
#### 2.1.2. 交互模式
當從 tty 讀取命令時,我們說解釋器在*交互模式* 下。這種模式下,解釋器以*主提示符* 提示輸入命令,主提示符通常標識為三個大于號(>>>) ;如果有續行,解釋器以*從提示符* 提示輸入,默認為三個點 (...)。在第一個提示符之前,解釋器會打印出一條歡迎信息聲明它的版本號和授權公告:
~~~
$ python3.4
Python 3.4 (default, Mar 16 2014, 09:25:04)
[GCC 4.8.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
~~~
輸入多行結構時需要續行。作為一個例子,看看這個[if](#)語句:
~~~
>>> the_world_is_flat = True
>>> 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)可以取消輸入,并返回到主提示符。[[2]](#)命令執行過程中輸入中斷符將引發[KeyboardInterrupt](# "KeyboardInterrupt")異常,它可以被[try](#)語句截獲。
#### 2.2.2. 可執行的 Python 腳本
在類 BSD 的 Unix 系統上,可以將Python 腳本變成可直接執行的,就像 shell 腳本一樣。通過放置一行
~~~
#! /usr/bin/env python3.4
~~~
(假定解釋器在用戶的PATH 中) 在腳本的開始并且給文件可執行的模式。#!必須是文件的前兩個字符。在一些平臺上,這第一行必須以一個 Unix 風格的行結束符 ('\n'),而不是 Windows 的行結束符 ('\r\n') 結尾。注意,字符 '#',是Python 注釋的起始符號。
可以通過?**chmod** 命令給予腳本可執行的模式或權限:
~~~
$ chmod +x myscript.py
~~~
在 Windows 系統上,沒有"可執行模式"的概念。Python 安裝程序會自動將 .py 文件與 python.exe 關聯,雙擊 Python 文件將以腳本的方式運行它。擴展名也可以是 .pyw,在這種情況下,通常出現的控制臺窗口不會在顯示了。
#### 2.2.3. 源程序的編碼
Python源文件默認以UTF-8編碼。在這種編碼下,世界上大多數語言的字符可以在字符串,標識符和注釋中同時使用 — 盡管標準庫中的標識符只使用ASCII字符,它是可移植代碼應該遵循的一個慣例。為了能夠正確顯示所有的這些字符,你的編輯器必須能夠識別文件是UTF-8編碼,且必須使用支持文件中所有字符的字體。
也可以給源文件指定一個不同的編碼。方法是在 #! 行的后面再增加一行特殊的注釋來定義源文件的編碼:
~~~
# -*- coding: encoding -*-
~~~
通過此聲明,源文件中的所有字符將被視為由 *encoding* 而不是UTF-8編碼。在 Python 庫參考手冊的 [codecs](# "codecs: Encode and decode data and streams.") 小節中,可以找到所有可能的編碼方式列表。
例如,如果你選擇的編輯器不支持UTF-8編碼的文件,而只能用其它編碼比如Windows-1252,你可以這樣寫:
~~~
# -*- coding: cp-1252 -*-
currency = u"€"
print ord(currency)
~~~
并且源文件中的所有字符仍然使用Windows-1252字符集。這個特殊的編碼注釋必須位于文件的*第一或者第二* 行。
#### 2.2.4. 交互式啟動文件
當您以交互方式使用 Python 時,讓解釋器在每次啟動時執行一些標準命令會變得非常方便。你可以通過設置環境變量 [PYTHONSTARTUP](#) 為包含你的啟動命令的文件的名字。這類似于 Unix shell 的.profile功能。
這個文件只會在交互式會話時讀取,當 Python 從腳本中讀取命令時不會讀取,當/dev/tty 在命令中明確指明時也不會讀取 (盡管這種方式很像是交互方式)。它和交互式命令在相同的命名空間中執行,所以在交互式會話中,由它定義或引用的一切可以在解釋器中不受限制地使用。您還可以在此文件中更改sys.ps1和sys.ps2 的提示符。
如果您想要從當前目錄讀取額外的啟動文件,你可以在全局啟動文件中使用這樣的代碼 ifos.path.isfile('.pythonrc.py'):exec(open('.pythonrc.py').read())。如果你想要在腳本中使用啟動文件,必須要在腳本中明確地寫出:
~~~
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
exec(open(filename).read())
~~~
#### 2.2.5. 自定義模塊
Python 提供了兩個鉤子(方法)來本地化: sitecustomize和usercustomize。若要查看它是如何工作,你首先需要找到你的 site-packages 的目錄。啟動 Python 并運行下面的代碼:
~~~
>>> import site
>>> site.getusersitepackages()
'/home/user/.local/lib/python3.4/site-packages'
~~~
現在你可以在此目錄下創建名為usercustomize.py的文件,并把任何你想要的東西放在里面。它會影響每個 Python 調用,除非啟動時用[*-s*](#)選項來禁用自動導入。
sitecustomize的工作方式相同,但通常由計算機的管理員在全局?site-packages 目錄中創建,并在usercustomize之前導入。更多詳細信息請參閱 [site](# "site: Module responsible for site-specific configuration.") 模塊的文檔。
腳注
| [[1]](#) | On Unix, the Python 3.x interpreter is by default not installed with the executable named python, so that it does not conflict with a simultaneously installed Python 2.x executable. |
|-----|-----|
| [[2]](#) | A problem with the GNU Readline package may prevent this. |
|-----|-----|
- 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. 浮點數運算:問題和局限