IDLE?
源代碼: Lib/idlelib/
IDLE 是 Python 所內(nèi)置的開發(fā)與學(xué)習(xí)環(huán)境。
IDLE 具有以下特性:
編碼于 100% 純正的 Python,使用名為
tkinter
的圖形用戶界面工具跨平臺:在 Windows、Unix 和 macOS 上工作近似。
提供輸入輸出高亮和錯誤信息的 Python 命令行窗口 (交互解釋器)
提供多次撤銷操作、Python 語法高亮、智能縮進(jìn)、函數(shù)調(diào)用提示、自動補全等功能的多窗口文本編輯器
在多個窗口中檢索,在編輯器中替換文本,以及在多個文件中檢索(通過 grep)
提供持久保存的斷點調(diào)試、單步調(diào)試、查看本地和全局命名空間功能的調(diào)試器
配置、瀏覽以及其它對話框
啟動和代碼執(zhí)行?
在附帶 -s
選項啟用的情況下,IDLE 將會執(zhí)行環(huán)境變量 IDLESTARTUP
或 PYTHONSTARTUP
所引用的文件。 IDLE 會先檢查 IDLESTARTUP
;如果 IDLESTARTUP
存在則會運行被引用的文件。 如果 IDLESTARTUP
不存在,則 IDLE 會檢查 PYTHONSTARTUP
。 這些環(huán)境變量所引用的文件是存放經(jīng)常被 IDLE Shell 所使用的函數(shù),或者執(zhí)行導(dǎo)入常用模塊的 import 語句的便捷場所。
此外,Tk
也會在存在啟動文件時加載它。 請注意 Tk 文件會被無條件地加載。 此附加文件名為 .Idle.py
并且會在用戶的家目錄下查找。 此文件中的語句將在 Tk 的命名空間中執(zhí)行,所以此文件不適用于導(dǎo)入要在 IDLE 的 Python Shell 中使用的函數(shù)。
命令行用法?
idle.py [-c command] [-d] [-e] [-h] [-i] [-r file] [-s] [-t title] [-] [arg] ...
-c command run command in the shell window
-d enable debugger and open shell window
-e open editor window
-h print help message with legal combinations and exit
-i open shell window
-r file run file in shell window
-s run $IDLESTARTUP or $PYTHONSTARTUP first, in shell window
-t title set title of shell window
- run stdin in shell (- must be last option before args)
如果有參數(shù):
如果使用了
-
,-c
或r
,則放在sys.argv[1:...]
和sys.argv[0]
中的所有參數(shù)都會被設(shè)為''
,'-c'
或'-r'
。 不會打開任何編輯器窗口,即使是在選項對話框中的默認(rèn)設(shè)置。在其他情況下,參數(shù)為要打開編輯的文件而
sys.argv
反映的是傳給 IDLE 本身的參數(shù)。
啟動失敗?
IDLE 使用一個套接字在 IDLE GUI 進(jìn)程和用戶代碼執(zhí)行進(jìn)程之間通信。 當(dāng) Shell 啟動或重啟動時必須建立一個連接。 (重啟動會以一個內(nèi)容為 'RESTART' 的分隔行來標(biāo)示)。 如果用戶進(jìn)程無法連接到 GUI 進(jìn)程,它通常會顯示一個包含 'cannot connect' 消息的 Tk
錯誤提示框來引導(dǎo)用戶。 隨后將會退出程序。
有一個 Unix 系統(tǒng)專屬的連接失敗是由系統(tǒng)網(wǎng)絡(luò)設(shè)置中錯誤配置的掩碼規(guī)則導(dǎo)致的。 當(dāng)從一個終端啟動 IDLE 時,用戶將看到一條以 ** Invalid host:
開頭的消息。 有效的值為 127.0.0.1 (idlelib.rpc.LOCALHOST)
。 用戶可以在一個終端窗口輸入 tcpconnect -irv 127.0.0.1 6543
并在另一個終端窗口中輸入 tcplisten <same args>
來進(jìn)行診斷。
導(dǎo)致連接失敗的一個常見原因是用戶創(chuàng)建的文件與標(biāo)準(zhǔn)庫模塊同名,例如 random.py 和 tkinter.py。 當(dāng)這樣的文件與要運行的文件位于同一目錄中時,IDLE 將無法導(dǎo)入標(biāo)準(zhǔn)庫模塊。 可用的解決辦法是重命名用戶文件。
雖然現(xiàn)在已不太常見,但殺毒軟件或防火墻程序也有可能會阻止連接。 如果無法將此類程序設(shè)為允許連接,那么為了運行 IDLE 就必須將其關(guān)閉。 允許這樣的內(nèi)部連接是安全的,因為數(shù)據(jù)在外部端口上不可見。 一個類似的問題是錯誤的網(wǎng)絡(luò)配置阻止了連接。
Python 的安裝問題有時會使 IDLE 退出:存在多個版本時可能導(dǎo)致程序崩潰,或者單獨安裝時可能需要管理員權(quán)限。 如果想要避免程序崩潰,或是不想以管理員身份運行,最簡單的做法是完全卸載 Python 并重新安裝。
有時會出現(xiàn) pythonw.exe 僵尸進(jìn)程問題。 在 Windows 上,可以使用任務(wù)管理員來檢查并停止該進(jìn)程。 有時由程序崩潰或鍵盤中斷(control-C)所發(fā)起的重啟動可能會出現(xiàn)連接失敗。 關(guān)閉錯誤提示框或使用 Shell 菜單中的 Restart Shell 可能會修復(fù)此類臨時性錯誤。
當(dāng) IDLE 首次啟動時,它會嘗試讀取 ~/.idlerc/
中的用戶配置文件(~ 是用戶的家目錄)。 如果配置有問題,則應(yīng)當(dāng)顯示一條錯誤消息。 除隨機(jī)磁盤錯誤之外,此類錯誤均可通過不手動編輯這些文件來避免。 請使用 Options 菜單來打開配置對話框。 一旦用戶配置文件出現(xiàn)錯誤,最好的解決辦法就是刪除它并使用配置對話框重新設(shè)置。
如果 IDLE 退出時沒有發(fā)出任何錯誤消息,并且它不是通過控制臺啟動的,請嘗試通過控制臺或終端 (python -m idlelib
) 來啟動它以查看是否會出現(xiàn)錯誤消息。
在基于 Unix 的系統(tǒng)上使用 tcl/tk 低于 8.6.11
的版本 (查看 About IDLE
) 時特定字體的特定字符可能導(dǎo)致終端提示 tk 錯誤消息。 這可能發(fā)生在啟動 IDLE 編輯包此種字符的文件或是在之后輸入此種字符的時候。 如果無法升級 tcl/tk,可以重新配置 IDLE 來使用其他的字體。
運行用戶代碼?
除了少量例外,使用 IDLE 執(zhí)行 Python 代碼的結(jié)果應(yīng)當(dāng)與使用默認(rèn)方法,即在文本模式的系統(tǒng)控制臺或終端窗口中直接通過 Python 解釋器執(zhí)行同樣的代碼相同。 但是,不同的界面和操作有時會影響顯示的結(jié)果。 例如,sys.modules
初始時具有更多條目,而 threading.active_count()
將返回 2 而不是 1。
在默認(rèn)情況下,IDLE 會在單獨的 OS 進(jìn)程中運行用戶代碼而不是在運行 Shell 和編輯器的用戶界面進(jìn)程中運行。 在執(zhí)行進(jìn)程中,它會將 sys.stdin
, sys.stdout
和 sys.stderr
替換為從 Shell 窗口獲取輸入并向其發(fā)送輸出的對象。 保存在 sys.__stdin__
, sys.__stdout__
和 sys.__stderr__
中的原始值不會被改變,但可能會為 None
。
將打印輸出從一個進(jìn)程發(fā)送到另一個進(jìn)程中的文本部件要比打印到同一個進(jìn)程中的系統(tǒng)終端慢。 這在打印多個參數(shù)時將有更明顯的影響,因為每個參數(shù)、每個分隔符和換行符對應(yīng)的字符串都要單獨發(fā)送。 在開發(fā)中,這通常不算是問題,但如果希望能在 IDLE 中更快地打印,可以將想要顯示的所有內(nèi)容先格式化并拼接到一起然后打印單個字符串。 格式字符串和 str.join()
都可以被用于合并字段和文本行。
IDLE 的標(biāo)準(zhǔn)流替換不會被執(zhí)行進(jìn)程中創(chuàng)建的子進(jìn)程所繼承,不論它是由用戶代碼直接創(chuàng)建還是由 multiprocessing 之類的模塊創(chuàng)建的。 如果這樣的子進(jìn)程使用了 input
獲取 sys.stdin 或者使用了 print
或 write
輸出到 sys.stdout 或 sys.stderr,則應(yīng)當(dāng)在命令行窗口中啟動 IDLE。 這樣二級子進(jìn)程將會被附加到該窗口進(jìn)行輸出和輸出。
如果 sys
被用戶代碼重置,例如使用了 importlib.reload(sys)
,則 IDLE 的修改將丟失,來自鍵盤的輸入和向屏幕的輸出將無法正確運作。
當(dāng) Shell 獲得焦點時,它將控制鍵盤與屏幕。 這通常會保持透明,但一些直接訪問鍵盤和屏幕的函數(shù)將會不起作用。 這也包括那些確定是否有鍵被按下以及是哪個鍵被按下的系統(tǒng)專屬函數(shù)。
在執(zhí)行進(jìn)程中運行的 IDLE 代碼會向調(diào)用棧添加在其他情況下不存在的幀。 IDLE 包裝了 sys.getrecursionlimit
和 sys.setrecursionlimit
以減少額外棧幀的影響。
當(dāng)用戶代碼直接或者通過調(diào)用 sys.exit 引發(fā) SystemExit 時,IDLE 將返回 Shell 提示符而非完全退出。
Shell中的用戶輸出?
當(dāng)一個程序輸出文本時,結(jié)果將由相應(yīng)的輸出設(shè)備來確定。 當(dāng) IDLE 執(zhí)行用戶代碼時,sys.stdout
和 sys.stderr
會被連接到 IDLE Shell 的顯示區(qū)。 它的某些特性是從底層的 Tk Text 部件繼承而來。 其他特性則是程序所添加的。 總之,Shell 被設(shè)計用于開發(fā)環(huán)境而非生產(chǎn)環(huán)境運行。
例如,Shell 絕不會丟棄輸出。 一個向 Shell 發(fā)送無限輸出的程序?qū)⒆罱K占滿內(nèi)存,導(dǎo)致內(nèi)存錯誤。 作為對比,某些系統(tǒng)文本模式窗口只會保留輸出的最后 n 行。 例如,Windows 控制臺可由用戶設(shè)置保留 1 至 9999 行,默認(rèn)為 300 行。
A Tk Text widget, and hence IDLE's Shell, displays characters (codepoints) in the BMP (Basic Multilingual Plane) subset of Unicode. Which characters are displayed with a proper glyph and which with a replacement box depends on the operating system and installed fonts. Tab characters cause the following text to begin after the next tab stop. (They occur every 8 'characters'). Newline characters cause following text to appear on a new line. Other control characters are ignored or displayed as a space, box, or something else, depending on the operating system and font. (Moving the text cursor through such output with arrow keys may exhibit some surprising spacing behavior.)
>>> 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
函數(shù)會被用于表達(dá)式值的交互式回顯。 它將返回輸入字符串的一個修改版本,其中的控制代碼、部分 BMP 碼位以及所有非 BMP 碼位都將被替換為轉(zhuǎn)義代碼。 如上面所演示的,它使用戶可以辨識字符串中的字符,無論它們會如何顯示。
普通的與錯誤的輸出通常會在與代碼輸入和彼此之間保持區(qū)分 (顯示于不同的行)。 它們也會分別使用不同的高亮顏色。
對于 SyntaxError 回溯信息,表示檢測到錯誤位置的正常 '^' 標(biāo)記被替換為帶有代表錯誤的文本顏色高亮。 當(dāng)從文件運行的代碼導(dǎo)致了其他異常時,用戶可以右擊回溯信息行在 IDLE 編輯器中跳轉(zhuǎn)到相應(yīng)的行。 如有必要將打開相應(yīng)的文件。
Shell 具有將輸出行折疊為一個 'Squeezed text' 標(biāo)簽的特殊功能。 此功能將自動應(yīng)用于超過 N 行的輸出 (默認(rèn) N = 50)。 N 可以在設(shè)置對話框中 General 頁的 PyShell 區(qū)域中修改。 行數(shù)更少的輸出也可通過在輸出上右擊來折疊。 此功能適用于過多的輸出行數(shù)導(dǎo)致滾動操作變慢的情況。
已折疊的輸出可通過雙擊該標(biāo)簽來原地展開。 也可通過右擊該標(biāo)簽將其發(fā)送到剪貼板或單獨的查看窗口。
開發(fā) tkinter 應(yīng)用程序?
IDLE 有意與標(biāo)準(zhǔn) Python 保持區(qū)別以方便 tkinter 程序的開發(fā)。 在標(biāo)準(zhǔn) Python 中輸入 import tkinter as tk; root = tk.Tk()
不會顯示任何東西。 在 IDLE 中輸入同樣的代碼則會顯示一個 tk 窗口。 在標(biāo)準(zhǔn) Python 中,還必須輸入 root.update()
才會將窗口顯示出來。 IDLE 會在幕后執(zhí)行同樣的方法,每秒大約 20 次,即每隔大約 50 毫秒。 下面輸入 b = tk.Button(root, text='button'); b.pack()
。 在標(biāo)準(zhǔn) Python 中仍然不會有任何可見的變化,直到輸入 root.update()
。
大多數(shù) tkinter 程序都會運行 root.mainloop()
,它通常直到 tk 應(yīng)用被銷毀時才會返回。 如果程序是通過 python -i
或 IDLE 編輯器運行的,則 >>>
Shell 提示符將直到 mainloop()
返回時才會出現(xiàn),這時將結(jié)束程序的交互。
當(dāng)通過 IDLE 編輯器運行 tkinter 程序時,可以注釋掉 mainloop 調(diào)用。 這樣將立即回到 Shell 提示符并可與正在運行的應(yīng)用程序交互。 請記得當(dāng)在標(biāo)準(zhǔn) Python 中運行時重新啟用 mainloop 調(diào)用。
在沒有子進(jìn)程的情況下運行?
在默認(rèn)情況下,IDLE 是通過一個套接字在單獨的子進(jìn)程中執(zhí)行用戶代碼,它將使用內(nèi)部的環(huán)回接口。 這個連接在外部不可見并且不會在互聯(lián)網(wǎng)上發(fā)送或接收數(shù)據(jù)。 如果防火墻仍然會報警,你完全可以忽略。
如果創(chuàng)建套接字連接的嘗試失敗,IDLE 將會通知你。 這樣的失敗可能是暫時性的,但是如果持續(xù)存在,問題可能是防火墻阻止了連接或某個系統(tǒng)配置錯誤。 在問題得到解決之前,可以使用 -n 命令行開關(guān)來運行 IDLE。
如果 IDLE 啟動時使用了 -n 命令行開關(guān)則它將在單個進(jìn)程中運行并且將不再創(chuàng)建運行 RPC Python 執(zhí)行服務(wù)器的子進(jìn)程。 這適用于 Python 無法在你的系統(tǒng)平臺上創(chuàng)建子進(jìn)程或 RPC 套接字接口的情況。 但是,在這種模式下用戶代碼沒有與 IDLE 本身相隔離。 而且,當(dāng)選擇 Run/Run Module (F5) 時運行環(huán)境也不會重啟。 如果你的代碼已被修改,你必須為受影響的模塊執(zhí)行 reload() 并重新導(dǎo)入特定的條目 (例如 from foo import baz) 才能讓修改生效。 出于這些原因,在可能的情況下最好還是使用默認(rèn)的子進(jìn)程來運行 IDLE。
3.4 版后已移除.
幫助和偏好?
幫助源?
Help 菜單項 "IDLE Help" 會顯示標(biāo)準(zhǔn)庫參考中 IDLE 一章的帶格式 HTML 版本。 這些內(nèi)容放在只讀的 tkinter 文本窗口中,與在瀏覽器中看到的內(nèi)容類似。 可使用鼠標(biāo)滾輪、滾動條或上下方向鍵來瀏覽文本。 或是點擊 TOC (Table of Contents) 按鈕并在打開的選項框中選擇一個節(jié)標(biāo)題。
Help 菜單項 "Python Docs" 會打開更豐富的幫助源,包括教程,通過 docs.python.org/x.y
來訪問,其中 'x.y' 是當(dāng)前運行的 Python 版本。 如果你的系統(tǒng)有此文檔的離線副本 (這可能是一個安裝選項),則將打開這個副本。
選定的 URL 可以使用配置 IDLE 對話框的 General 選項卡隨時在幫助菜單中添加或移除。
首選項設(shè)置?
字體首選項、高亮、按鍵和通用首選項可通過 Option 菜單的配置 IDLE 項來修改。 非默認(rèn)的用戶設(shè)置將保存在用戶家目錄下的 .idlerc
目錄中。 用戶配置文件錯誤導(dǎo)致的問題可通過編輯或刪除 .idlerc
中的一個或多個文件來解決。
在 Font 選項卡中,可以查看使用多種語言的多個字符的示例文本來了解字體或字號效果。 可以編輯示例文本來添加想要的其他字符。 請使用示例文本選擇等寬字體。 如果某些字符在 Shell 或編輯器中的顯示有問題,可以將它們添加到示例文本的開頭并嘗試改變字號和字體。
在 Highlights 和 Keys 選項卡中,可以選擇內(nèi)置或自定義的顏色主題和按鍵集合。 要將更新的內(nèi)置顏色主題或按鍵集合與舊版 IDLE 一起使用,可以將其保存為新的自定義主題或按鍵集合就將可在舊版 IDLE 中使用。
macOS 上的IDLE?
在 System Preferences: Dock 中,可以將 "Prefer tabs when opening documents" 設(shè)為 "Always"。 但是該設(shè)置不能兼容 IDLE 所使用的 tk/tkinter GUI 框架,并會使得部分 IDLE 特性失效。
擴(kuò)展?
IDLE 可以包含擴(kuò)展插件。 擴(kuò)展插件的首選項可通過首選項對話框的 Extensions 選項卡來修改。 請查看 idlelib 目錄下 config-extensions.def 的開頭來了解詳情。 目前唯一的擴(kuò)展插件是 zzdummy,它也是一個測試用的示例。