引言¶
“Python 庫”包含幾種不同型別的元件。
它包含通常被認為是語言“核心”組成部分的資料型別,例如數字和列表。對於這些型別,Python 語言核心定義了字面量的形式,並對其語義施加了一些約束,但沒有完全定義語義。(另一方面,語言核心確實定義了語法屬性,例如運算子的拼寫和優先順序。)
該庫還包含內建函式和異常——所有 Python 程式碼都可以使用這些物件,而無需 import
語句。其中一些由核心語言定義,但許多對於核心語義並非必不可少,僅在此處描述。
然而,該庫的大部分由模組集合組成。解剖這個集合的方法有很多種。一些模組是用 C 編寫並內建到 Python 直譯器中;另一些是用 Python 編寫並以原始碼形式匯入的。一些模組提供高度特定於 Python 的介面,例如列印堆疊跟蹤;一些提供特定於特定作業系統的介面,例如訪問特定硬體;另一些提供特定於特定應用領域的介面,例如全球資訊網。一些模組在所有 Python 版本和移植中都可用;另一些只有在底層系統支援或需要它們時才可用;還有一些只有在編譯和安裝 Python 時選擇了特定配置選項時才可用。
本手冊是“由內而外”組織的:它首先描述內建函式、資料型別和異常,最後是模組,按相關模組章節分組。
這意味著,如果您從頭開始閱讀本手冊,並在感到厭倦時跳到下一章,您將對 Python 庫支援的可用模組和應用領域有一個合理的概述。當然,您不必像小說一樣閱讀它——您也可以瀏覽目錄(手冊前面),或者在索引(手冊後面)中查詢特定的函式、模組或術語。最後,如果您喜歡學習隨機主題,您可以選擇一個隨機頁碼(參見模組 random
)並閱讀一兩節。無論您以何種順序閱讀本手冊的章節,從 內建函式 一章開始都會有所幫助,因為手冊的其餘部分都假設您熟悉這些內容。
演出開始!
可用性注意事項¶
“可用性:Unix”註釋表示此函式通常在 Unix 系統上找到。它不就其在特定作業系統上的存在做出任何宣告。
如果未另行註明,所有聲稱“可用性:Unix”的函式都支援 macOS、iOS 和 Android,所有這些都基於 Unix 核心。
如果可用性註釋包含最低核心版本和最低 libc 版本,則兩個條件都必須滿足。例如,具有註釋 可用性:Linux >= 3.17 with glibc >= 2.27 的功能需要 Linux 3.17 或更高版本以及 glibc 2.27 或更高版本。
WebAssembly 平臺¶
WebAssembly 平臺 wasm32-emscripten
(Emscripten) 和 wasm32-wasi
(WASI) 提供 POSIX API 的子集。WebAssembly 執行時和瀏覽器是沙盒化的,對主機和外部資源的訪問有限。任何使用程序、執行緒、網路、訊號或其他形式的程序間通訊 (IPC) 的 Python 標準庫模組要麼不可用,要麼可能無法像在其他類 Unix 系統上那樣工作。檔案 I/O、檔案系統和與 Unix 許可權相關的功能也受到限制。Emscripten 不允許阻塞 I/O。其他阻塞操作,如 sleep()
會阻塞瀏覽器事件迴圈。
Python 在 WebAssembly 平臺上的屬性和行為取決於 Emscripten-SDK 或 WASI-SDK 版本、WASM 執行時(瀏覽器、NodeJS、wasmtime)和 Python 構建時間標誌。WebAssembly、Emscripten 和 WASI 是不斷發展的標準;某些功能(如網路)將來可能會得到支援。
對於瀏覽器中的 Python,使用者應考慮 Pyodide 或 PyScript。PyScript 建立在 Pyodide 之上,而 Pyodide 本身建立在 CPython 和 Emscripten 之上。Pyodide 提供對瀏覽器 JavaScript 和 DOM API 的訪問,以及使用 JavaScript 的 XMLHttpRequest
和 Fetch
API 的有限網路功能。
程序相關的 API 不可用或始終失敗並報錯。這包括產生新程序的 API (
fork()
,execve()
)、等待程序 (waitpid()
)、傳送訊號 (kill()
) 或以其他方式與程序互動的 API。subprocess
模組可以匯入但不起作用。socket
模組可用,但功能有限,並且與其他平臺上的行為不同。在 Emscripten 上,套接字始終是非阻塞的,並且需要在伺服器端額外的 JavaScript 程式碼和助手以透過 WebSockets 代理 TCP;有關更多資訊,請參閱 Emscripten 網路。WASI snapshot preview 1 只允許使用現有檔案描述符的套接字。一些函式是存根,它們要麼什麼都不做,要麼總是返回硬編碼值。
與檔案描述符、檔案許可權、檔案所有權和連結相關的函式受到限制,並且不支援某些操作。例如,WASI 不允許帶有絕對檔名的符號連結。
移動平臺¶
Android 和 iOS 在大多數方面都是 POSIX 作業系統。檔案 I/O、套接字處理和執行緒的行為都與任何 POSIX 作業系統一樣。但是,有幾個主要區別
移動平臺只能在“嵌入式”模式下使用 Python。沒有 Python REPL,也無法使用單獨的可執行檔案,例如 python 或 pip。要將 Python 程式碼新增到您的移動應用,您必須使用 Python 嵌入 API。有關更多詳細資訊,請參閱 在 Android 上使用 Python 和 在 iOS 上使用 Python。
子程序
在 Android 上,建立子程序是可能的,但 官方不支援。特別是,Android 不支援 System V IPC API 的任何部分,因此
multiprocessing
不可用。iOS 應用無法使用任何形式的子程序、多程序或程序間通訊。如果 iOS 應用嘗試建立子程序,建立子程序的程序將要麼死鎖,要麼崩潰。除了為此目的存在的 iOS 特定 API 之外,iOS 應用無法檢視正在執行的其他應用,也無法與正在執行的其他應用進行通訊。
移動應用修改系統資源(例如系統時鐘)的許可權有限。這些資源通常是*可讀*的,但嘗試修改這些資源通常會失敗。
控制檯輸入和輸出
在 Android 上,原生的
stdout
和stderr
未連線到任何東西,因此 Python 安裝了它自己的流,將訊息重定向到系統日誌。這些訊息分別在python.stdout
和python.stderr
標籤下可見。iOS 應用對控制檯輸出的概念有限。
stdout
和stderr
*存在*,並且在 Xcode 中執行時,寫入stdout
和stderr
的內容將在日誌中可見,但這些內容*不會*記錄在系統日誌中。如果安裝了您的應用的使用者提供他們的應用日誌作為診斷幫助,它們將不包含寫入stdout
或stderr
的任何詳細資訊。移動應用根本沒有可用的
stdin
。雖然應用可以顯示螢幕鍵盤,但這是一種軟體功能,而不是連線到stdin
的東西。