引言

“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,使用者應考慮 PyodidePyScript。PyScript 建立在 Pyodide 之上,而 Pyodide 本身建立在 CPython 和 Emscripten 之上。Pyodide 提供對瀏覽器 JavaScript 和 DOM API 的訪問,以及使用 JavaScript 的 XMLHttpRequestFetch 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,也無法使用單獨的可執行檔案,例如 pythonpip。要將 Python 程式碼新增到您的移動應用,您必須使用 Python 嵌入 API。有關更多詳細資訊,請參閱 在 Android 上使用 Python在 iOS 上使用 Python

  • 子程序

    • 在 Android 上,建立子程序是可能的,但 官方不支援。特別是,Android 不支援 System V IPC API 的任何部分,因此 multiprocessing 不可用。

    • iOS 應用無法使用任何形式的子程序、多程序或程序間通訊。如果 iOS 應用嘗試建立子程序,建立子程序的程序將要麼死鎖,要麼崩潰。除了為此目的存在的 iOS 特定 API 之外,iOS 應用無法檢視正在執行的其他應用,也無法與正在執行的其他應用進行通訊。

  • 移動應用修改系統資源(例如系統時鐘)的許可權有限。這些資源通常是*可讀*的,但嘗試修改這些資源通常會失敗。

  • 控制檯輸入和輸出

    • 在 Android 上,原生的 stdoutstderr 未連線到任何東西,因此 Python 安裝了它自己的流,將訊息重定向到系統日誌。這些訊息分別在 python.stdoutpython.stderr 標籤下可見。

    • iOS 應用對控制檯輸出的概念有限。stdoutstderr *存在*,並且在 Xcode 中執行時,寫入 stdoutstderr 的內容將在日誌中可見,但這些內容*不會*記錄在系統日誌中。如果安裝了您的應用的使用者提供他們的應用日誌作為診斷幫助,它們將不包含寫入 stdoutstderr 的任何詳細資訊。

    • 移動應用根本沒有可用的 stdin。雖然應用可以顯示螢幕鍵盤,但這是一種軟體功能,而不是連線到 stdin 的東西。

      因此,涉及控制檯操作的 Python 模組(例如 cursesreadline)在移動平臺上不可用。