引言¶
“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
的东西。