API 和 ABI 版本控制

构建时版本常量

CPython 在以下宏中暴露其版本号。请注意,这些对应于代码**构建**时使用的版本。有关**运行时**使用的版本,请参阅 Py_Version

有关跨版本 API 和 ABI 稳定性的讨论,请参阅 C API 稳定性

PY_MAJOR_VERSION

3.4.1a2 中的 3

PY_MINOR_VERSION

3.4.1a2 中的 4

PY_MICRO_VERSION

3.4.1a2 中的 1

PY_RELEASE_LEVEL

3.4.1a2 中的 a。这可以是表示 alpha 的 0xA,表示 beta 的 0xB,表示候选发布版的 0xC 或表示最终版的 0xF

PY_RELEASE_SERIAL

3.4.1a2 中的 2。最终发布版为零。

PY_VERSION_HEX

Python 版本号编码为单个整数。有关编码详情,请参阅 Py_PACK_FULL_VERSION()

用于数字比较,例如 #if PY_VERSION_HEX >= ...

运行时版本

const unsigned long Py_Version
自 3.11 版起成为 稳定 ABI 的一部分。

Python 运行时版本号编码为单个常量整数。有关编码详情,请参阅 Py_PACK_FULL_VERSION()。这包含运行时使用的 Python 版本。

用于数字比较,例如 if (Py_Version >= ...)

在 3.11 版本中新增。

位封装宏

uint32_t Py_PACK_FULL_VERSION(int major, int minor, int micro, int release_level, int release_serial)
自 3.14 版本以来,作为 稳定 ABI 的一部分。

返回给定版本,编码为单个 32 位整数,结构如下:

参数

位数

位掩码

位移

示例值

3.4.1a2

3.10.0

major

8

0xFF000000

24

0x03

0x03

minor

8

0x00FF0000

16

0x04

0x0A

micro

8

0x0000FF00

8

0x01

0x00

release_level

4

0x000000F0

4

0xA

0xF

release_serial

4

0x0000000F

0

0x2

0x0

例如:

版本

Py_PACK_FULL_VERSION 参数

编码版本

3.4.1a2

(3, 4, 1, 0xA, 2)

0x030401a2

3.10.0

(3, 10, 0, 0xF, 0)

0x030a00f0

参数中超出范围的位将被忽略。也就是说,宏可以定义为:

#ifndef Py_PACK_FULL_VERSION
#define Py_PACK_FULL_VERSION(X, Y, Z, LEVEL, SERIAL) ( \
   (((X) & 0xff) << 24) |                              \
   (((Y) & 0xff) << 16) |                              \
   (((Z) & 0xff) << 8) |                               \
   (((LEVEL) & 0xf) << 4) |                            \
   (((SERIAL) & 0xf) << 0))
#endif

Py_PACK_FULL_VERSION 主要是一个宏,旨在用于 #if 指令,但它也可以作为导出的函数使用。

在 3.14 版本加入。

uint32_t Py_PACK_VERSION(int major, int minor)
自 3.14 版本以来,作为 稳定 ABI 的一部分。

等同于 Py_PACK_FULL_VERSION(major, minor, 0, 0, 0)。结果不对应任何 Python 版本,但对于数字比较很有用。

在 3.14 版本加入。