簡介¶
“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()
)會阻塞瀏覽器事件迴圈。
WebAssembly 平臺上 Python 的屬性和行為取決於 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()
)或以其他方式與程序互動。subprocess
是可匯入的,但不起作用。socket
模組是可用的,但受到限制,其行為與其他平臺不同。在 Emscripten 上,套接字始終是非阻塞的,並且需要在伺服器上使用額外的 JavaScript 程式碼和輔助程式來透過 WebSockets 代理 TCP;有關更多資訊,請參閱 Emscripten 網路。WASI 快照預覽 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 應用程式看不到正在執行的其他應用程式,也無法與正在執行的其他應用程式通訊,iOS 為此目的存在的特定 API 除外。
移動應用程式對修改系統資源(例如系統時鐘)的訪問許可權有限。這些資源通常是可讀的,但嘗試修改這些資源通常會失敗。
控制檯輸入和輸出
在 Android 上,本機
stdout
和stderr
沒有連線到任何內容,因此 Python 會安裝自己的流,這些流會將訊息重定向到系統日誌。這些可以在標籤python.stdout
和python.stderr
下看到。iOS 應用程式對控制檯輸出的概念有限。
stdout
和stderr
存在,並且當在 Xcode 中執行時,寫入stdout
和stderr
的內容將在日誌中可見,但是此內容不會記錄在系統日誌中。如果安裝了您的應用程式的使用者提供他們的應用程式日誌作為診斷幫助,則它們不會包含寫入stdout
或stderr
的任何詳細資訊。移動應用程式根本沒有可用的
stdin
。雖然應用程式可以顯示螢幕鍵盤,但這是一種軟體功能,而不是附加到stdin
的東西。