IDLE — Python 編輯器與 Shell¶
原始碼: Lib/idlelib/
IDLE 是 Python 的整合開發和學習環境。
IDLE 具有以下特性:
跨平臺:在 Windows、Unix 和 macOS 上的工作方式基本相同
帶有程式碼輸入、輸出和錯誤訊息高亮功能的 Python Shell 視窗(互動式直譯器)
多視窗文字編輯器,具有多次撤銷、Python 語法高亮、智慧縮排、呼叫提示、自動補全以及其他特性
在任意視窗內搜尋、在編輯器視窗內替換,以及在多個檔案中搜索 (grep)
帶有持久斷點、步進以及檢視全域性和區域性名稱空間的偵錯程式
配置、瀏覽器及其他對話方塊
啟動和程式碼執行¶
啟動時如果帶有 -s
選項,IDLE 將執行由環境變數 IDLESTARTUP
或 PYTHONSTARTUP
引用的檔案。IDLE 首先檢查 IDLESTARTUP
;如果 IDLESTARTUP
存在,則執行引用的檔案。如果 IDLESTARTUP
不存在,IDLE 會檢查 PYTHONSTARTUP
。這些環境變數引用的檔案是儲存從 IDLE Shell 中頻繁使用的函式或執行 import 語句以匯入常用模組的方便之處。
此外,如果存在啟動檔案,Tk
也會載入它。請注意,Tk 檔案是無條件載入的。這個額外的檔案是 .Idle.py
,並在使用者的主目錄中查詢。此檔案中的語句將在 Tk 名稱空間中執行,因此該檔案不適用於匯入要在 IDLE 的 Python Shell 中使用的函式。
命令列用法¶
IDLE 可以透過命令列呼叫,並帶有各種選項。通用語法是:
python -m idlelib [options] [file ...]
以下選項可用:
- -c <command>¶
在 Shell 視窗中執行指定的 Python 命令。例如,傳遞
-c "print('Hello, World!')"
。在 Windows 上,外層引號必須是雙引號,如圖所示。
- -d¶
啟用偵錯程式並開啟 Shell 視窗。
- -e¶
開啟一個編輯器視窗。
- -h¶
列印一個帶有合法選項組合的幫助訊息並退出。
- -i¶
開啟一個 Shell 視窗。
- -r <file>¶
在 Shell 視窗中執行指定的檔案。
- -s¶
在開啟 Shell 視窗之前,執行啟動檔案(由環境變數
IDLESTARTUP
或PYTHONSTARTUP
定義)。
- -t <title>¶
設定 Shell 視窗的標題。
- -¶
在 Shell 視窗中讀取並執行標準輸入。此選項必須是任何引數之前的最後一個選項。
如果提供了引數:
如果使用了
-
、-c
或-r
,所有引數都放在sys.argv[1:]
中,並且sys.argv[0]
分別設定為''
、'-c'
或'-r'
。即使在*選項*對話方塊中設定了預設值,也不會開啟編輯器視窗。否則,引數被視為要開啟進行編輯的檔案,並且
sys.argv
反映傳遞給 IDLE 本身的引數。
啟動失敗¶
IDLE 使用套接字在 IDLE GUI 程序和使用者程式碼執行程序之間進行通訊。每當 Shell 啟動或重啟時,都必須建立連線。(後者由一條寫著‘RESTART’的分隔線表示)。如果使用者程序無法連線到 GUI 程序,它通常會顯示一個帶有‘無法連線’訊息的 Tk
錯誤框,並將使用者引導到這裡。然後它會退出。
Unix 系統上一種特定的連線失敗是由於系統網路設定中某處配置不當的偽裝規則造成的。當從終端啟動 IDLE 時,您會看到一條以 ** Invalid host:
開頭的訊息。有效值是 127.0.0.1 (idlelib.rpc.LOCALHOST)
。您可以在一個終端視窗中使用 tcpconnect -irv 127.0.0.1 6543
進行診斷,在另一個終端視窗中使用 tcplisten <same args>
。
一個常見的失敗原因是使用者編寫的檔案與標準庫模組同名,例如 *random.py* 和 *tkinter.py*。當這樣的檔案與即將執行的檔案位於同一目錄時,IDLE 無法匯入標準庫檔案。目前的解決方法是重新命名使用者檔案。
雖然不如過去常見,但防毒軟體或防火牆程式可能會阻止連線。如果無法教會程式允許連線,那麼必須將其關閉才能讓 IDLE 工作。允許這種內部連線是安全的,因為在外部埠上看不到任何資料。類似的問題是阻止連線的網路配置錯誤。
Python 安裝問題偶爾會阻止 IDLE:多個版本可能衝突,或者單個安裝可能需要管理員許可權。如果解決衝突,或者不能或不想以管理員身份執行,最簡單的方法可能是完全移除 Python 並重新開始。
一個殭屍 pythonw.exe 程序可能是一個問題。在 Windows 上,使用任務管理器檢查是否存在殭屍程序,如果存在則停止它。有時,由程式崩潰或鍵盤中斷(control-C)引發的重啟可能無法連線。關閉錯誤框或在 Shell 選單上使用“重啟 Shell”可能會修復臨時問題。
當 IDLE 首次啟動時,它會嘗試讀取 ~/.idlerc/
(~ 是您的主目錄) 中的使用者配置檔案。如果出現問題,應該會顯示一條錯誤訊息。除了隨機的磁碟故障,這可以透過從不手動編輯檔案來避免。相反,請使用“選項”下的配置對話方塊。一旦使用者配置檔案出現錯誤,最好的解決方案可能是刪除它,然後從設定對話方塊重新開始。
如果 IDLE 在沒有訊息的情況下退出,並且它不是從控制檯啟動的,請嘗試從控制檯或終端啟動它(python -m idlelib
),看看是否會產生錯誤訊息。
在 tcl/tk 版本低於 8.6.11
(請參閱 關於 IDLE
)的基於 Unix 的系統上,某些字型的某些字元可能會導致 tk 失敗,並向終端顯示一條訊息。這可能發生在啟動 IDLE 編輯包含此類字元的檔案時,或稍後輸入此類字元時。如果您無法升級 tcl/tk,則重新配置 IDLE 以使用效果更好的字型。
執行使用者程式碼¶
除了極少數例外,使用 IDLE 執行 Python 程式碼的結果旨在與預設方法(即直接在文字模式系統控制檯或終端視窗中使用 Python 執行相同程式碼)相同。然而,不同的介面和操作偶爾會影響可見結果。例如,sys.modules
開始時條目更多,threading.active_count()
返回 2 而不是 1。
預設情況下,IDLE 在一個獨立的作業系統程序中執行使用者程式碼,而不是在執行 Shell 和編輯器的使用者介面程序中。在執行程序中,它用從 Shell 視窗獲取輸入並向其傳送輸出的物件替換 sys.stdin
、sys.stdout
和 sys.stderr
。儲存在 sys.__stdin__
、sys.__stdout__
和 sys.__stderr__
中的原始值不會被觸動,但可能是 None
。
將列印輸出從一個程序傳送到另一個程序中的文字小部件,比在同一程序中列印到系統終端要慢。這在列印多個引數時影響最大,因為每個引數的字串、每個分隔符、換行符都是分開發送的。對於開發來說,這通常不是問題,但如果您想在 IDLE 中更快地列印,請格式化並連線所有您想一起顯示的內容,然後列印一個單一的字串。格式化字串和 str.join()
都可以幫助組合欄位和行。
IDLE 的標準流替換不會被執行程序中建立的子程序繼承,無論是直接由使用者程式碼建立還是由 multiprocessing 等模組建立。如果這些子程序使用來自 sys.stdin 的 input
或向 sys.stdout 或 sys.stderr 進行 print
或 write
,IDLE 應該在命令列視窗中啟動。(在 Windows 上,使用 python
或 py
而不是 pythonw
或 pyw
。)次級子程序將被附加到該視窗以進行輸入和輸出。
如果使用者程式碼重置了 sys
,例如使用 importlib.reload(sys)
,IDLE 的更改將丟失,鍵盤輸入和螢幕輸出將無法正常工作。
當 Shell 具有焦點時,它控制鍵盤和螢幕。這通常是透明的,但直接訪問鍵盤和螢幕的函式將不起作用。這些包括確定是否按下了某個鍵以及按下了哪個鍵的系統特定函式。
在執行程序中執行的 IDLE 程式碼會向呼叫堆疊新增一些本來不存在的幀。IDLE 包裝了 sys.getrecursionlimit
和 sys.setrecursionlimit
以減少額外堆疊幀的影響。
當用戶程式碼直接或透過呼叫 sys.exit 引發 SystemExit 時,IDLE 會返回到 Shell 提示符而不是退出。
Shell 中的使用者輸出¶
當程式輸出文字時,結果由相應的輸出裝置決定。當 IDLE 執行使用者程式碼時,sys.stdout
和 sys.stderr
連線到 IDLE Shell 的顯示區域。它的一些特性繼承自底層的 Tk 文字小部件。其他的是程式設計新增的。在重要的地方,Shell 是為開發而非生產執行而設計的。
例如,Shell 從不丟棄輸出。向 Shell 傳送無限輸出的程式最終會填滿記憶體,導致記憶體錯誤。相比之下,一些系統文字視窗只保留最後 n 行輸出。例如,Windows 控制檯保留使用者可設定的 1 到 9999 行,預設為 300。
一個 Tk 文字小部件,因此 IDLE 的 Shell,顯示 Unicode 的 BMP(基本多文種平面)子集中的字元(碼點)。哪些字元顯示為正確的字形,哪些顯示為替換框,取決於作業系統和安裝的字型。製表符導致後面的文字在下一個製表位後開始。(它們每 8 個‘字元’出現一次)。換行符導致後面的文字出現在新的一行。其他控制字元被忽略或顯示為空格、方框或其他東西,具體取決於作業系統和字型。(用方向鍵在這樣的輸出中移動文字游標可能會表現出一些令人驚訝的間距行為。)
>>> s = 'a\tb\a<\x02><\r>\bc\nd' # Enter 22 chars.
>>> len(s)
14
>>> s # Display repr(s)
'a\tb\x07<\x02><\r>\x08c\nd'
>>> print(s, end='') # Display s as is.
# Result varies by OS and font. Try it.
repr
函式用於表示式值的互動式回顯。它返回輸入字串的修改版本,其中控制程式碼、一些 BMP 碼點和所有非 BMP 碼點都被替換為轉義碼。如上所示,它允許您識別字符串中的字元,而不管它們是如何顯示的。
正常輸出和錯誤輸出通常與程式碼輸入和彼此分開(在不同的行上)。它們各自獲得不同的高亮顏色。
對於 SyntaxError 的回溯,正常的‘^’標記檢測到錯誤的位置被替換為用錯誤高亮顏色標記文字。當從檔案執行的程式碼導致其他異常時,您可以在回溯行上右鍵單擊,跳轉到 IDLE 編輯器中的相應行。如有必要,檔案將被開啟。
Shell 有一個特殊功能,可以將輸出行壓縮成一個“Squeezed text”標籤。這對於超過 N 行(預設 N = 50)的輸出是自動完成的。N 可以在設定對話方塊的“通用”頁面的 PyShell 部分更改。行數較少的輸出可以透過右鍵單擊輸出來壓縮。這對於長到足以減慢滾動的行很有用。
壓縮的輸出可以透過雙擊標籤在原地展開。也可以透過右鍵單擊標籤將其傳送到剪貼簿或單獨的檢視視窗。
開發 tkinter 應用程式¶
IDLE 有意與標準 Python 不同,以便於開發 tkinter 程式。在標準 Python 中輸入 import tkinter as tk; root = tk.Tk()
,什麼都不會出現。在 IDLE 中輸入相同的程式碼,會彈出一個 tk 視窗。在標準 Python 中,還必須輸入 root.update()
才能看到視窗。IDLE 在後臺執行等效操作,大約每秒 20 次,即大約每 50 毫秒一次。接下來輸入 b = tk.Button(root, text='button'); b.pack()
。同樣,在標準 Python 中,直到輸入 root.update()
之前,視覺上沒有任何變化。
大多數 tkinter 程式執行 root.mainloop()
,這通常在 tk 應用被銷燬之前不會返回。如果程式是用 python -i
或從 IDLE 編輯器執行的,那麼在 mainloop()
返回之前,不會出現 >>>
shell 提示符,而此時已經沒有什麼可以互動的了。
當從 IDLE 編輯器執行 tkinter 程式時,可以註釋掉 mainloop 呼叫。然後你會立即得到一個 shell 提示符,並可以與活動的應用程式互動。只需要記住在標準 Python 中執行時重新啟用 mainloop 呼叫。
不使用子程序執行¶
預設情況下,IDLE 透過套接字在單獨的子程序中執行使用者程式碼,該套接字使用內部環回介面。此連線在外部不可見,不會向網際網路傳送或接收任何資料。如果防火牆軟體仍然抱怨,你可以忽略它。
如果嘗試建立套接字連線失敗,Idle會通知您。這種失敗有時是暫時的,但如果持續存在,問題可能是防火牆阻止了連線或特定系統的配置錯誤。在問題解決之前,可以使用 -n 命令列開關執行 Idle。
如果 IDLE 使用 -n 命令列開關啟動,它將在單個程序中執行,並且不會建立執行 RPC Python 執行伺服器的子程序。如果 Python 無法在您的平臺上建立子程序或 RPC 套接字介面,這可能很有用。但是,在這種模式下,使用者程式碼與 IDLE 本身沒有隔離。此外,當選擇“執行/執行模組 (F5)”時,環境不會重新啟動。如果您的程式碼已修改,您必須 reload() 受影響的模組並重新匯入任何特定的項(例如 from foo import baz),以便更改生效。由於這些原因,如果可能的話,最好使用預設的子程序執行 IDLE。
自 3.4 版起不建議使用。
幫助和首選項¶
幫助源¶
“幫助”選單項“IDLE 幫助”顯示了庫參考中 IDLE 章節的格式化 HTML 版本。結果在一個只讀的 tkinter 文字視窗中,與在 Web 瀏覽器中看到的非常接近。可以使用滑鼠滾輪、捲軸或按住上下箭頭鍵在文字中導航。或者點選 TOC (目錄) 按鈕,在開啟的框中選擇一個章節標題。
幫助選單項“Python 文件”打開了位於 docs.python.org/x.y
的大量幫助資源,包括教程,其中‘x.y’是當前執行的 Python 版本。如果您的系統有離線文件副本(這可能是一個安裝選項),則會開啟該副本。
可以使用“配置 IDLE”對話方塊的“通用”選項卡隨時在幫助選單中新增或刪除選定的 URL。
設定首選項¶
字型首選項、高亮顯示、快捷鍵和常規首選項可以透過“選項”選單上的“配置 IDLE”進行更改。非預設的使用者設定儲存在使用者主目錄下的 .idlerc
目錄中。由錯誤的使用者配置檔案引起的問題可以透過編輯或刪除 .idlerc
中的一個或多個檔案來解決。
在“字型”選項卡上,檢視文字示例以瞭解字型和大小對多種語言中多個字元的影響。編輯示例以添加個人感興趣的其他字元。使用該示例選擇等寬字型。如果特定字元在 Shell 或編輯器中有問題,請將它們新增到示例的頂部,並嘗試先更改大小,然後更改字型。
在“高亮”和“按鍵”選項卡上,選擇一個內建或自定義的顏色主題和按鍵集。要將較新的內建顏色主題或按鍵集與舊版 IDLE 一起使用,請將其另存為新的自定義主題或按鍵集,這樣舊版 IDLE 就可以訪問它。
macOS 上的 IDLE¶
在“系統偏好設定:程式塢”中,您可以將“開啟文稿時首選標籤頁”設定為“始終”。此設定與 IDLE 使用的 tk/tkinter GUI 框架不相容,並且會破壞一些 IDLE 功能。
擴充套件¶
IDLE 包含一個擴充套件功能。擴充套件的首選項可以在首選項對話方塊的“擴充套件”選項卡中更改。有關更多資訊,請參閱 idlelib 目錄中 config-extensions.def 的開頭。當前唯一的預設擴充套件是 zzdummy,它也是一個用於測試的示例。
idlelib — IDLE 應用程式的實現¶
原始碼: Lib/idlelib
Lib/idlelib 包實現了 IDLE 應用程式。有關如何使用 IDLE 的資訊,請參閱本頁的其餘部分。
idlelib 中的檔案在 idlelib/README.txt 中有描述。可以在 idlelib 中訪問它,或者在 IDLE 選單上單擊“幫助”=>“關於 IDLE”。該檔案還將 IDLE 選單項對映到實現該項的程式碼。除了在“啟動”下列出的檔案外,idlelib 程式碼是“私有的”,意味著功能更改可以被向後移植(參見PEP 434)。