16. 附錄?

16.1. 交互模式?

16.1.1. 錯誤處理?

當(dāng)發(fā)生錯誤時,解釋器會打印錯誤信息和錯誤堆棧。在交互模式下,將返回到主命令提示符;如果輸入內(nèi)容來自文件,在打印錯誤堆棧之后,程序會以非零狀態(tài)退出。(這里所說的錯誤不包括 try 語句中由 except 所捕獲的異常。)有些錯誤是無條件致命的,會導(dǎo)致程序以非零狀態(tài)退出;比如內(nèi)部邏輯矛盾或內(nèi)存耗盡。所有錯誤信息都會被寫入標(biāo)準(zhǔn)錯誤流;而命令的正常輸出則被寫入標(biāo)準(zhǔn)輸出流。

將中斷字符(通常為 Control-CDelete )鍵入主要或輔助提示會取消輸入并返回主提示符。 1 在執(zhí)行命令時鍵入中斷引發(fā)的 KeyboardInterrupt 異常,可以由 try 語句處理。

16.1.2. 可執(zhí)行的Python腳本?

在BSD等類Unix系統(tǒng)上,Python腳本可以直接執(zhí)行,就像shell腳本一樣,第一行添加:

#!/usr/bin/env python3.5

(假設(shè)解釋器位于用戶的 PATH )腳本的開頭,并將文件設(shè)置為可執(zhí)行。 #! 必須是文件的前兩個字符。在某些平臺上,第一行必須以Unix樣式的行結(jié)尾('\n')結(jié)束,而不是以Windows('\r\n')行結(jié)尾。請注意,散列或磅字符 '#' 在Python中代表注釋開始。

可以使用 chmod 命令為腳本提供可執(zhí)行模式或權(quán)限。

$ chmod +x myscript.py

在Windows系統(tǒng)上,沒有“可執(zhí)行模式”的概念。 Python安裝程序自動將 .py 文件與 python.exe 相關(guān)聯(lián),這樣雙擊Python文件就會將其作為腳本運(yùn)行。擴(kuò)展也可以是 .pyw ,在這種情況下,會隱藏通常出現(xiàn)的控制臺窗口。

16.1.3. 交互式啟動文件?

當(dāng)您以交互方式使用Python時,每次啟動解釋器時都會執(zhí)行一些標(biāo)準(zhǔn)命令,這通常很方便。您可以通過將名為 PYTHONSTARTUP 的環(huán)境變量設(shè)置為包含啟動命令的文件名來實現(xiàn)。這類似于Unix shell的 .profile 功能。

此文件只會在交互式會話時讀取,而非在 Python 從腳本讀取指令或是在給定 /dev/tty 為指令的明確來源時(后者反而表現(xiàn)得像是一個交互式會話)。 該文件執(zhí)行時所在的命名空間與交互式指令相同,所以它定義或?qū)氲膶ο罂梢栽诮换ナ綍捴兄苯邮褂谩?你也可以在該文件中更改提示符 sys.ps1sys.ps2

如果你想從當(dāng)前目錄中讀取一個額外的啟動文件,你可以使用像 if os.path.isfile('.pythonrc.py'): exec(open('.pythonrc.py').read()) 這樣的代碼在全局啟動文件中對它進(jìn)行編程。如果要在腳本中使用啟動文件,則必須在腳本中顯式執(zhí)行此操作:

import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    with open(filename) as fobj:
        startup_file = fobj.read()
    exec(startup_file)

16.1.4. 定制模塊?

Python提供了兩個鉤子來讓你自定義它:sitecustomizeusercustomize。要查看其工作原理,首先需要找到用戶site-packages目錄的位置。啟動Python并運(yùn)行此代碼:

>>>
>>> import site
>>> site.getusersitepackages()
'/home/user/.local/lib/python3.5/site-packages'

現(xiàn)在,您可以在該目錄中創(chuàng)建一個名為 usercustomize.py 的文件,并將所需內(nèi)容放入其中。它會影響Python的每次啟動,除非它以 -s 選項啟動,以禁用自動導(dǎo)入。

sitecustomize 以相同的方式工作,但通常由計算機(jī)管理員在全局 site-packages 目錄中創(chuàng)建,并在 usercustomize 之前被導(dǎo)入。有關(guān)詳情請參閱 site 模塊的文檔。

備注

1

GNU Readline 包的問題可能會阻止這種情況。