简介

“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,用户应考虑使用 PyodidePyScript。PyScript 构建在 Pyodide 之上,而 Pyodide 本身构建在 CPython 和 Emscripten 之上。Pyodide 提供对浏览器 JavaScript 和 DOM API 的访问,以及使用 JavaScript 的 XMLHttpRequestFetch 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,也无法使用单独的可执行文件(例如 pythonpip)。要将 Python 代码添加到您的移动应用程序中,您必须使用 Python 嵌入 API。有关更多详细信息,请参阅 在 Android 上使用 Python在 iOS 上使用 Python

  • 子进程

    • 在 Android 上,创建子进程是可能的,但官方不支持。特别是,Android 不支持 System V IPC API 的任何部分,因此 multiprocessing 不可用。

    • iOS 应用程序不能使用任何形式的子处理、多处理或进程间通信。如果 iOS 应用程序尝试创建子进程,则创建子进程的进程要么锁定,要么崩溃。iOS 应用程序看不到正在运行的其他应用程序,也无法与正在运行的其他应用程序通信,iOS 为此目的存在的特定 API 除外。

  • 移动应用程序对修改系统资源(例如系统时钟)的访问权限有限。这些资源通常是可读的,但尝试修改这些资源通常会失败。

  • 控制台输入和输出

    • 在 Android 上,本机 stdoutstderr 没有连接到任何内容,因此 Python 会安装自己的流,这些流会将消息重定向到系统日志。这些可以在标签 python.stdoutpython.stderr 下看到。

    • iOS 应用程序对控制台输出的概念有限。stdoutstderr存在,并且当在 Xcode 中运行时,写入 stdoutstderr 的内容将在日志中可见,但是此内容不会记录在系统日志中。如果安装了您的应用程序的用户提供他们的应用程序日志作为诊断帮助,则它们不会包含写入 stdoutstderr 的任何详细信息。

    • 移动应用程序根本没有可用的 stdin。虽然应用程序可以显示屏幕键盘,但这是一种软件功能,而不是附加到 stdin 的东西。

      因此,涉及控制台操作的 Python 模块(例如 cursesreadline)在移动平台上不可用。