PEP 739 – build-details.json 1.0 — eine statische Beschreibungsdatei für Python-Build-Details
- Autor:
- Filipe Laíns <lains at python.org>
- PEP-Delegate:
- Paul Moore <p.f.moore at gmail.com>
- Discussions-To:
- Discourse thread
- Status:
- Akzeptiert
- Typ:
- Standards Track
- Thema:
- Packaging
- Erstellt:
- 19-Dez-2023
- Python-Version:
- 3.14
- Resolution:
- Discourse-Nachricht
Zusammenfassung
Dieser PEP führt build-details.json ein, eine statische Beschreibungsdatei, die Build-Details von Python-Installationen enthält.
Sie enthält die Definition von Version 1.0 des Dateiformats und definiert den Standardpfad für diese Datei.
Begründung
Bei der Introspektion einer Python-Installation ist die Ausführung von Code oft unerwünscht oder unmöglich. Eine statische Beschreibungsdatei macht verschiedene Build-Details der Python-Installation verfügbar, ohne den Interpreter ausführen zu müssen.
Dies ist hilfreich für Anwendungsfälle wie Kreuzkompilierung, Python-Launcher usw.
Umfang
build-details.json ist eine installationsweite Datei, was bedeutet, dass sie nur Informationen enthalten darf, die über alle Umgebungen der Python-Installation hinweg konstant sind.
Umgebungsspezifische Informationen, wie der site-packages-Pfad, liegen außerhalb des Geltungsbereichs dieser Datei. Die PEP-Autoren gehen davon aus, dass über einen zukünftigen PEP eine statische Umgebungsbeschreibungsdatei eingeführt wird.
Spezifikation
Ab Python 3.14 muss eine Datei namens build-details.json, die dem in diesem PEP oder einer zukünftigen Version spezifizierten Format folgt, im plattformunabhängigen Verzeichnis der Standardbibliothek (stdlib, z.B. /usr/lib/python3.14/build-details.json) installiert werden, ES SEI DENN, dies ist aufgrund technischer Einschränkungen nicht möglich.
Achtung
Zusätzlich zum von diesem PEP spezifizierten Standardspeicherort kann die Datei build-details.json auch an zusätzlichen Speicherorten und unter einem anderen Namen installiert werden. Ungeachtet dessen sollte die Datei immer noch am Standardspeicherort verfügbar sein.
Tatsächlich gehen die PEP-Autoren davon aus, dass zukünftige PEPs zusätzliche Installationsspeicherorte mit besserer Auffindbarkeit definieren werden.
Format
Die Spezifikation des Formats wird durch die unten bereitgestellte JSON-Schema-Definition definiert, die hier in einem menschenlesbaren Format gerendert wird.
$schema |
https://json-schema.org/draft/2020-12/schema |
$id |
https://github.com/python/peps/blob/main/peps/pep-0739/python-build-info-v1.0.schema.json |
| Titel | build-details.json — eine statische Beschreibungsdatei mit Build-Details von Python-Installationen |
| Typ | object |
| Zusätzliche Eigenschaften | Nicht erlaubt |
schema_version
| Typ | string (konstant — 1.0) |
| Description | Schema-Version. Dies ist ein String im Format Für diese Spezifikationsversion ist dieser Wert konstant und muss Zukünftige Versionen dieses Schemas müssen eine höhere Versionsnummer verwenden. Zukünftige Versionen dieses Schemas dürfen nicht dieselbe Hauptversionskomponente wie andere Schemaversionen verwenden, es sei denn, ihre Spezifikation wird als abwärtskompatibel mit ihnen betrachtet – sie kann keine Teile der aktuellen Spezifikation so ändern oder erweitern, dass sich die Semantik der interpretierten Daten unterscheidet oder dass Daten, die unter der neuen Spezifikation gültig sind, unter der älteren Spezifikation ungültig sind, mit Ausnahme von zusätzlichen Eigenschaften (Fehler, die durch |
| Erforderlich | True |
base_prefix
| Typ | string |
| Description | Basispräfix der Python-Installation. Entweder ein absoluter Pfad oder ein Pfad relativ zum Verzeichnis, in dem sich diese Datei befindet. |
| Beispiele | /usr, ../.. usw. |
| Erforderlich | True |
base_interpreter
| Typ | string |
| Description | Der Pfad zum Python-Interpreter der Basisinstallation. Entweder ein absoluter Pfad oder ein Pfad relativ zu Dieses Feld muss vorhanden sein, wenn die Installation eine Interpreter-ausführbare Datei bereitstellt. |
| Beispiele |
|
| Erforderlich | False |
platform
| Typ | string |
| Description | Systemplattform-String. Dieses Feld sollte äquivalent zu |
| Beispiele |
|
| Erforderlich | True |
language
| Typ | object |
| Description | Objekt mit Details zur Python-Sprachspezifikation. |
| Erforderlich | True |
| Zusätzliche Eigenschaften | Nicht erlaubt |
language.version
| Typ | string |
| Description | String-Darstellung der Python-Sprachversion — eine Versionszeichenfolge, die nur aus den Haupt- und Nebenkomponenten besteht. Dieses Feld sollte äquivalent zu |
| Beispiele | 3.14 usw. |
| Erforderlich | True |
language.version_info
| Typ | object |
| Description | Objekt im Format von sys.version_info.Dieser Abschnitt sollte äquivalent zu |
| Beispiele |
|
| Erforderlich | False |
| Zusätzliche Eigenschaften | Nicht erlaubt |
language.version_info.major
| Typ | number |
| Erforderlich | True |
language.version_info.minor
| Typ | number |
| Erforderlich | True |
language.version_info.micro
| Typ | number |
| Erforderlich | True |
language.version_info.releaselevel
| Typ | string (enum — alpha, beta, candidate, final) |
| Erforderlich | True |
language.version_info.serial
| Typ | number |
| Erforderlich | True |
implementation
| Typ | object |
| Description | Objekt mit Details zur Python-Implementierung. Dieser Abschnitt sollte äquivalent zu |
| Erforderlich | True |
| Zusätzliche Eigenschaften | Erlaubt |
implementation.name
| Typ | string |
| Description | Klein geschriebener Name der Python-Implementierung. |
| Beispiele | cpython, pypy usw. |
| Erforderlich | True |
implementation.version
| Typ | object |
| Description | Objekt im Format von sys.version_info, das die Implementierungsversion enthält. |
| Beispiele |
|
| Erforderlich | True |
| Zusätzliche Eigenschaften | Nicht erlaubt |
implementation.version.major
| Typ | number |
| Erforderlich | True |
implementation.version.minor
| Typ | number |
| Erforderlich | True |
implementation.version.micro
| Typ | number |
| Erforderlich | True |
implementation.version.releaselevel
| Typ | string (enum — alpha, beta, candidate, final) |
| Erforderlich | True |
implementation.version.serial
| Typ | number |
| Erforderlich | True |
abi
| Typ | object |
| Description | Objekt mit Details zu ABI. |
| Erforderlich | False |
| Zusätzliche Eigenschaften | Nicht erlaubt |
abi.flags
| Typ | array |
| Description | Build-Konfigurationsflags, die zur Berechnung des Erweiterungs-Suffixes verwendet werden. Die Flags müssen in der Reihenfolge definiert sein, in der sie im Erweiterungs-Suffix erscheinen. |
| Beispiele | ['t', 'd'] usw. |
| Erforderlich | True |
abi.extension_suffix
| Typ | string |
| Description | Suffix, der für Erweiterungen verwendet wird, die gegen die aktuelle Implementierungsversion erstellt wurden. Dieses Feld muss vorhanden sein, wenn die Python-Implementierung Erweiterungen unterstützt, andernfalls fehlt dieser Eintrag. |
| Beispiele |
|
| Erforderlich | False |
abi.stable_abi_suffix
| Typ | string |
| Description | Suffix, der für Erweiterungen verwendet wird, die gegen die stabile ABI erstellt wurden. Dieses Feld muss vorhanden sein, wenn die Python-Implementierung einen stabilen ABI-Erweiterungs-Suffix hat, andernfalls fehlt dieser Eintrag. |
| Beispiele | .abi3.so usw. |
| Erforderlich | False |
suffixes
| Typ | object |
| Description | Gültige Modul-Suffixe, gruppiert nach Typ. Dieser Abschnitt muss vorhanden sein, wenn die Python-Installation das Importieren externer Dateien unterstützt, und er sollte äquivalent zu den Attributen Zusätzlich, wenn eine Python-Implementierung andere Erweiterungsarten als die im Modul |
| Beispiele |
|
| Erforderlich | False |
| Zusätzliche Eigenschaften | Erlaubt |
libpython
| Typ | object |
| Description | Objekt mit Details zur libpython-Bibliothek.Dieser Abschnitt muss vorhanden sein, wenn die Python-Installation eine |
| Erforderlich | False |
| Zusätzliche Eigenschaften | Nicht erlaubt |
libpython.dynamic
| Typ | string |
| Description | Der Pfad zur dynamischen libpython-Bibliothek.Entweder ein absoluter Pfad oder ein Pfad relativ zu Dieses Feld muss vorhanden sein, wenn die Python-Installation eine dynamische |
| Beispiele |
|
| Erforderlich | False |
libpython.dynamic_stableabi
| Typ | string |
| Description | Der Pfad zur dynamischen libpython-Bibliothek für die stabile ABI.Entweder ein absoluter Pfad oder ein Pfad relativ zu Dieses Feld muss vorhanden sein, wenn die Python-Installation eine dynamische Wenn dieser Schlüssel vorhanden ist, muss auch |
| Beispiele |
|
| Erforderlich | False |
libpython.static
| Typ | string |
| Description | Der Pfad zur statischen libpython-Bibliothek.Entweder ein absoluter Pfad oder ein Pfad relativ zu Dieses Feld muss vorhanden sein, wenn die Python-Installation eine statische |
| Beispiele |
|
| Erforderlich | False |
libpython.link_extensions
| Typ | boolean |
| Description | Sollen gegen eine dynamische libpython kompilierte Erweiterungen mit ihr verknüpft werden?Dieses Feld muss vorhanden sein, wenn die Python-Installation eine dynamische |
| Erforderlich | False |
c_api
| Typ | object |
| Description | Objekt mit Details zur Python C API. Dieser Abschnitt muss vorhanden sein, wenn die Python-Implementierung eine C API bereitstellt, andernfalls fehlt dieser Abschnitt. |
| Erforderlich | False |
| Zusätzliche Eigenschaften | Nicht erlaubt |
c_api.headers
| Typ | string |
| Description | Der Pfad zu den C API-Headern. Entweder ein absoluter Pfad oder ein Pfad relativ zu |
| Beispiele |
|
| Erforderlich | True |
c_api.pkgconfig_path
| Typ | string |
| Description | Der Pfad zu den pkg-config-Definitionsdateien. Entweder ein absoluter Pfad oder ein Pfad relativ zu Dieses Feld muss vorhanden sein, wenn die Python-Implementierung pkg-config-Definitionsdateien bereitstellt, andernfalls fehlt dieser Abschnitt. |
| Beispiele |
|
| Erforderlich | False |
arbitrary_data
| Typ | object |
| Description | Objekt mit zusätzlichen beliebigen Daten. Dies ist als Notausgang gedacht, um relevante Daten einzuschließen, die nicht von dieser Spezifikation abgedeckt werden. Implementierungen können wählen, welche Daten in diesem Abschnitt bereitgestellt werden. |
| Erforderlich | False |
| Zusätzliche Eigenschaften | Erlaubt |
Beispiel
1{
2 "schema_version": "1.0",
3 "base_prefix": "/usr",
4 "base_interpreter": "/usr/bin/python",
5 "platform": "linux-x86_64",
6 "language": {
7 "version": "3.14",
8 "version_info": {
9 "major": 3,
10 "minor": 14,
11 "micro": 0,
12 "releaselevel": "alpha",
13 "serial": 0
14 }
15 },
16 "implementation": {
17 "name": "cpython",
18 "version": {
19 "major": 3,
20 "minor": 14,
21 "micro": 0,
22 "releaselevel": "alpha",
23 "serial": 0
24 },
25 "hexversion": 51249312,
26 "cache_tag": "cpython-314",
27 "_multiarch": "x86_64-linux-gnu"
28 },
29 "abi": {
30 "flags": ["t", "d"],
31 "extension_suffix": ".cpython-314-x86_64-linux-gnu.so",
32 "stable_abi_suffix": ".abi3.so"
33 },
34 "suffixes": {
35 "source": [".py"],
36 "bytecode": [".pyc"],
37 "optimized_bytecode": [".pyc"],
38 "debug_bytecode": [".pyc"],
39 "extensions": [".cpython-314-x86_64-linux-gnu.so", ".abi3.so", ".so"]
40 },
41 "libpython": {
42 "dynamic": "/usr/lib/libpython3.14.so.1.0",
43 "dynamic_stableabi": "/usr/lib/libpython3.so",
44 "static": "/usr/lib/python3.14/config-3.14-x86_64-linux-gnu/libpython3.14.a",
45 "link_extensions": true
46 },
47 "c_api": {
48 "headers": "/usr/include/python3.14",
49 "pkgconfig_path": "/usr/lib/pkgconfig"
50 }
51}
JSON-Schema
1{
2 "$schema": "https://json-schema.org/draft/2020-12/schema",
3 "$id": "https://github.com/python/peps/blob/main/peps/pep-0739/python-build-info-v1.0.schema.json",
4 "type": "object",
5 "title": "build-details.json — a static description file with build details of Python installations",
6 "required": [
7 "schema_version",
8 "base_prefix",
9 "platform",
10 "language",
11 "implementation"
12 ],
13 "additionalProperties": false,
14 "properties": {
15 "schema_version": {
16 "type": "string",
17 "description": "Schema version.\n\nThis is a string following the format ``<MAJOR>.<MINOR>``, where ``<MAJOR>`` and ``<MINOR>`` are unpaded numbers and represent the **major** and **minor** components of the version. Versions may be arithmetically compared by intrepreting the version string as a decimal number.\n\nFor this specification version, this value is constant and **MUST** be ``1.0``.\n\nFuture versions of this schema **MUST** use a higher version number. Future versions of this schema **MUST NOT** use the same **major** version component as other schema version unless its specification is deemed backwards-compatible with them — it can't change, or extend, any parts of the current specification in such a way as the semantics of the interpreted data differ, or that data valid under the new specification is invalid under the older specification, with the exception of additional properties (errors caused by ``additionalProperties``).",
18 "const": "1.0"
19 },
20 "base_prefix": {
21 "type": "string",
22 "description": "Base prefix of the Python installation.\n\nEither an absolute path, or a path relative to directory where this file is contained.",
23 "examples": [
24 "/usr",
25 "../.."
26 ]
27 },
28 "base_interpreter": {
29 "type": "string",
30 "description": "The path to the Python interprer of the base installation.\n\nEither an absolute path, or a path relative to ``base_prefix``.\n\nThis field **MUST** be present if the installation provides an interpreter executable.",
31 "examples": [
32 "/usr/bin/python",
33 "bin/python"
34 ]
35 },
36 "platform": {
37 "type": "string",
38 "description": "System platform string.\n\nThis field **SHOULD** be equivalent to ``sysconfig.get_platform()``.",
39 "examples": [
40 "linux-x86_64"
41 ]
42 },
43 "language": {
44 "type": "object",
45 "description": "Object containing details related to the Python language specification.",
46 "required": [
47 "version"
48 ],
49 "additionalProperties": false,
50 "properties": {
51 "version": {
52 "type": "string",
53 "description": "String representation the Python language version — a version string consisting only of the *major* and *minor* components.\n\nThis field **SHOULD** be equivalent to ``sysconfig.get_python_version()``.",
54 "examples": ["3.14"]
55 },
56 "version_info": {
57 "type": "object",
58 "description": "Object in the format of :py:data:`sys.version_info`.\n\nThis section **SHOULD** be equivalent to :py:data:`sys.version_info`.",
59 "required": ["major", "minor", "micro", "releaselevel", "serial"],
60 "additionalProperties": false,
61 "examples": [
62 {
63 "major": 3,
64 "minor": 14,
65 "micro": 1,
66 "releaselevel": "final",
67 "serial": 0
68 }
69 ],
70 "properties": {
71 "major": {
72 "type": "number"
73 },
74 "minor": {
75 "type": "number"
76 },
77 "micro": {
78 "type": "number"
79 },
80 "releaselevel": {
81 "type": "string",
82 "enum": ["alpha", "beta", "candidate", "final"]
83 },
84 "serial": {
85 "type": "number"
86 }
87 }
88 }
89 }
90 },
91 "implementation": {
92 "type": "object",
93 "description": "Object containing details related to Python implementation.\n\nThis section **SHOULD** be equivalent to :py:data:`sys.implementation`. It follows specification defined in PEP 421, meaning that on top of the required keys, implementation-specific keys can also exist, but must be prefixed with an underscore.",
94 "required": [
95 "name",
96 "version",
97 "hexversion",
98 "cache_tag"
99 ],
100 "additionalProperties": true,
101 "properties": {
102 "name": {
103 "type": "string",
104 "description": "Lower-case name of the Python implementation.",
105 "examples": ["cpython", "pypy"]
106 },
107 "version": {
108 "type": "object",
109 "description": "Object in the format of :py:data:`sys.version_info`, containing the implementation version.",
110 "required": ["major", "minor", "micro", "releaselevel", "serial"],
111 "additionalProperties": false,
112 "examples": [
113 {
114 "major": 3,
115 "minor": 14,
116 "micro": 1,
117 "releaselevel": "final",
118 "serial": 0
119 },
120 {
121 "major": 7,
122 "minor": 3,
123 "micro": 16,
124 "releaselevel": "final",
125 "serial": 0
126 }
127 ],
128 "properties": {
129 "major": {
130 "type": "number"
131 },
132 "minor": {
133 "type": "number"
134 },
135 "micro": {
136 "type": "number"
137 },
138 "releaselevel": {
139 "type": "string",
140 "enum": ["alpha", "beta", "candidate", "final"]
141 },
142 "serial": {
143 "type": "number"
144 }
145 }
146 }
147 }
148 },
149 "abi": {
150 "type": "object",
151 "description": "Object containing details related to ABI.",
152 "required": [
153 "flags"
154 ],
155 "additionalProperties": false,
156 "properties": {
157 "flags": {
158 "type": "array",
159 "description": "Build configuration flags, used to calculate the extension suffix.\n\nThe flags **MUST** be defined in the order they appear on the extension suffix.",
160 "additionalProperties": true,
161 "examples": [
162 ["t", "d"]
163 ]
164 },
165 "extension_suffix": {
166 "type": "string",
167 "description": "Suffix used for extensions built against the current implementation version.\n\nThis field **MUST** be present if the Python implementation supports extensions, otherwise this entry will be missing.",
168 "examples": [
169 ".cpython-314-x86_64-linux-gnu.so"
170 ]
171 },
172 "stable_abi_suffix": {
173 "type": "string",
174 "description": "Suffix used for extensions built against the stable ABI.\n\nThis field **MUST** be present if the Python implementation has a stable ABI extension suffix, otherwise this entry will be missing.",
175 "examples": [
176 ".abi3.so"
177 ]
178 }
179 }
180 },
181 "suffixes": {
182 "type": "object",
183 "description": "Valid module suffixes grouped by type.\n\nThis section **MUST** be present if the Python installation supports importing external files, and it **SHOULD** be equivalent to the ``importlib.machinery.*_SUFFIXES`` attributes.\n\nAdditionally, if a Python implementation provides extension kinds other than the ones listed on ``importlib.machinery`` module, they **MAY** add a sub-section for them.",
184 "examples": [
185 {
186 "source": [".py"],
187 "bytecode": [".pyc"],
188 "optimized_bytecode": [".pyc"],
189 "debug_bytecode": [".pyc"],
190 "extensions": [".cpython-313-x86_64-linux-gnu.so", ".abi3.so", ".so"]
191 }
192 ]
193 },
194 "libpython": {
195 "type": "object",
196 "description": "Object containing details related to the ``libpython`` library.\n\nThis section **MUST** by present if Python installation provides a ``libpython`` library, otherwise this section will be missing.",
197 "additionalProperties": false,
198 "properties": {
199 "dynamic": {
200 "type": "string",
201 "description": "The path to the dynamic ``libpython`` library.\n\nEither an absolute path, or a path relative to ``base_prefix``.\n\nThis field **MUST** be present if the Python installation provides a dynamic ``libpython`` library, otherwise this entry will be missing.",
202 "examples": [
203 "/usr/lib/libpython3.14.so.1.0",
204 "lib/libpython3.14.so.1.0"
205 ]
206 },
207 "dynamic_stableabi": {
208 "type": "string",
209 "description": "The path to the dynamic ``libpython`` library for the stable ABI.\n\nEither an absolute path, or a path relative to ``base_prefix``.\n\nThis field **MUST** be present if the Python installation provides a dynamic ``libpython`` library targetting the Stable ABI, otherwise this entry will be missing.\n\nIf this key is present ``dynamic`` **MUST** also be set.",
210 "examples": [
211 "/usr/lib/libpython3.so",
212 "lib/libpython3.so"
213 ]
214 },
215 "static": {
216 "type": "string",
217 "description": "The path to the static ``libpython`` library.\n\nEither an absolute path, or a path relative to ``base_prefix``.\n\nThis field **MUST** be present if the Python installation provides a static ``libpython`` library, otherwise this entry will be missing.",
218 "examples": [
219 "/usr/lib/python3.14/config-3.14-x86_64-linux-gnu/libpython3.14.a",
220 "lib/python3.14/config-3.14-x86_64-linux-gnu/libpython3.14.a"
221 ]
222 },
223 "link_extensions": {
224 "type": "boolean",
225 "description": "Should extensions built against a dynamic ``libpython`` link to it?\n\nThis field **MUST** be present if the Python installation provides a dynamic ``libpython`` library, otherwise this entry will be missing."
226 }
227 }
228 },
229 "c_api": {
230 "type": "object",
231 "description": "Object containing details related to the Python C API.\n\nThis section **MUST** be present if the Python implementation provides a C API, otherwise this section will be missing.",
232 "required": [
233 "headers"
234 ],
235 "additionalProperties": false,
236 "properties": {
237 "headers": {
238 "type": "string",
239 "description": "The path to the C API headers.\n\nEither an absolute path, or a path relative to ``base_prefix``.",
240 "examples": [
241 "/usr/include/python3.14",
242 "include/python3.14"
243 ]
244 },
245 "pkgconfig_path": {
246 "type": "string",
247 "description": "The path to the pkg-config definition files.\n\nEither an absolute path, or a path relative to ``base_prefix``.\n\nThis field **MUST** be present if the Python implementation provides pkg-config definition files, otherwise this section will be missing.",
248 "examples": [
249 "/usr/lib/pkgconfig",
250 "lib/pkgconfig"
251 ]
252 }
253 }
254 },
255 "arbitrary_data": {
256 "type": "object",
257 "description": "Object containing extra arbitrary data.\n\nThis is meant to be used as an escape-hatch, to include any relevant data that is not covered by this specification. Implementations may choose what data to provide in this section.",
258 "additionalProperties": true
259 }
260 }
261}
Abgelehnte Ideen
Einbeziehung umgebungsspezifischer Daten
Eine der Hauptanfragen in der Diskussion dieses PEP war die Aufnahme anderer Arten von Informationen, wie z.B. des site-packages-Pfades. Nach Meinung der PEP-Autoren sollten Informationen, die sich auf die Python-Umgebung beziehen, von einer separaten Datei bereitgestellt werden.
Die Aufnahme von umgebungsspezifischen Daten in die Konfigurationsdatei bedeutet, dass sie umgebungsspezifisch wäre, so dass virtuelle Umgebungen ihre eigenen Konfigurationsdateien benötigen würden. Dies ist problematisch, da virtuelle Umgebungen Updates der Basis-Python-Installation überleben, was die Möglichkeit schafft, dass die statische Konfigurationsdatei veraltet ist und ihre Daten unzuverlässig macht, was ihren Zweck vereitelt.
Die vorgeschlagene Lösung, die teilweise in diesem PEP umgesetzt wird, ist die Bereitstellung einer build-details.json-Datei, die sich auf die Basis-Python-Installation bezieht, und einer environment.json-Datei, die sich auf die spezifische Umgebung bezieht.
Da build-details.json Teil der Python-Distribution ist, wird auch build-details.json aktualisiert, wenn die Basis-Python-Installation aktualisiert wird, wodurch sichergestellt wird, dass die statischen Beschreibungsdateien niemals veraltet sind.
Urheberrecht
Dieses Dokument wird in die Public Domain oder unter die CC0-1.0-Universal-Lizenz gestellt, je nachdem, welche Lizenz permissiver ist.
Quelle: https://github.com/python/peps/blob/main/peps/pep-0739.rst
Zuletzt geändert: 2025-02-07 01:10:57 GMT