Skip to content

bpo-43931: Export Python version as API data #25577

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 12 commits into from
Dec 10, 2021
Merged
9 changes: 9 additions & 0 deletions Doc/c-api/apiabiversion.rst
Original file line number Diff line number Diff line change
Expand Up @@ -58,5 +58,14 @@ See :ref:`stable` for a discussion of API and ABI stability across versions.
Thus ``3.4.1a2`` is hexversion ``0x030401a2`` and ``3.10.0`` is
hexversion ``0x030a00f0``.

This version is also available via the symbol :data:`Py_Version`.

.. c:var:: const unsigned long Py_Version

The Python runtime version number encoded in a single constant integer, with
the same format as the c:macro:`PY_VERSION_HEX` macro.
This contains the Python version used at run time.

.. versionadded:: 3.11

All the given macros are defined in :source:`Include/patchlevel.h`.
2 changes: 2 additions & 0 deletions Doc/c-api/init.rst
Original file line number Diff line number Diff line change
Expand Up @@ -553,6 +553,8 @@ Process-wide parameters
period. The returned string points into static storage; the caller should not
modify its value. The value is available to Python code as :data:`sys.version`.

See also the :data:`Py_Version` constant.


.. c:function:: const char* Py_GetPlatform()

Expand Down
1 change: 1 addition & 0 deletions Doc/data/stable_abi.dat
Original file line number Diff line number Diff line change
Expand Up @@ -830,6 +830,7 @@ type,Py_UCS4,3.2,
macro,Py_UNBLOCK_THREADS,3.2,
var,Py_UTF8Mode,3.8,
function,Py_VaBuildValue,3.2,
var,Py_Version,3.11,
function,Py_XNewRef,3.10,
type,Py_intptr_t,3.2,
type,Py_ssize_t,3.2,
Expand Down
4 changes: 4 additions & 0 deletions Doc/whatsnew/3.11.rst
Original file line number Diff line number Diff line change
Expand Up @@ -626,6 +626,10 @@ New Features
fields of the result from the exception instance (the ``value`` field).
(Contributed by Irit Katriel in :issue:`45711`.)

* Added the :c:data:`Py_Version` constant which bears the same value as
:c:macro:`PY_VERSION_HEX`.
(Contributed by Gabriele N. Tornetta in :issue:`43931`.)


Porting to Python 3.11
----------------------
Expand Down
4 changes: 4 additions & 0 deletions Include/pylifecycle.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,10 @@ typedef void (*PyOS_sighandler_t)(int);
PyAPI_FUNC(PyOS_sighandler_t) PyOS_getsig(int);
PyAPI_FUNC(PyOS_sighandler_t) PyOS_setsig(int, PyOS_sighandler_t);

#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030B0000
PyAPI_DATA(const unsigned long) Py_Version;
#endif

#ifndef Py_LIMITED_API
# define Py_CPYTHON_PYLIFECYCLE_H
# include "cpython/pylifecycle.h"
Expand Down
3 changes: 3 additions & 0 deletions Lib/test/test_capi.py
Original file line number Diff line number Diff line change
Expand Up @@ -840,6 +840,9 @@ class Test_testcapi(unittest.TestCase):
def test_widechar(self):
_testcapi.test_widechar()

def test_version_api_data(self):
self.assertEqual(_testcapi.Py_Version, sys.hexversion)


class Test_testinternalcapi(unittest.TestCase):
locals().update((name, getattr(_testinternalcapi, name))
Expand Down
1 change: 1 addition & 0 deletions Lib/test/test_stable_abi_ctypes.py
Original file line number Diff line number Diff line change
Expand Up @@ -808,6 +808,7 @@ def test_available_symbols(self):
"Py_SetRecursionLimit",
"Py_UTF8Mode",
"Py_VaBuildValue",
"Py_Version",
"Py_XNewRef",
"_PyArg_ParseTupleAndKeywords_SizeT",
"_PyArg_ParseTuple_SizeT",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Added the :c:data:`Py_Version` constant which bears the same value as
:c:macro:`PY_VERSION_HEX`. Patch by Gabriele N. Tornetta.
3 changes: 3 additions & 0 deletions Misc/stable_abi.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2153,3 +2153,6 @@ data PyStructSequence_UnnamedField

# (Detailed comments aren't really needed for further entries: from here on
# we can use version control logs.)

data Py_Version
added 3.11
1 change: 1 addition & 0 deletions Modules/_testcapimodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -7525,6 +7525,7 @@ PyInit__testcapi(void)
PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX));
PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN));
PyModule_AddObject(m, "SIZEOF_TIME_T", PyLong_FromSsize_t(sizeof(time_t)));
PyModule_AddObject(m, "Py_Version", PyLong_FromUnsignedLong(Py_Version));
Py_INCREF(&PyInstanceMethod_Type);
PyModule_AddObject(m, "instancemethod", (PyObject *)&PyInstanceMethod_Type);

Expand Down
1 change: 1 addition & 0 deletions PC/python3dll.c
Original file line number Diff line number Diff line change
Expand Up @@ -725,6 +725,7 @@ EXPORT_DATA(Py_FileSystemDefaultEncoding)
EXPORT_DATA(Py_GenericAliasType)
EXPORT_DATA(Py_HasFileSystemDefaultEncoding)
EXPORT_DATA(Py_UTF8Mode)
EXPORT_DATA(Py_Version)
EXPORT_DATA(PyBaseObject_Type)
EXPORT_DATA(PyBool_Type)
EXPORT_DATA(PyByteArray_Type)
Expand Down
3 changes: 3 additions & 0 deletions Python/getversion.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,6 @@ Py_GetVersion(void)
PY_VERSION, Py_GetBuildInfo(), Py_GetCompiler());
return version;
}

// Export the Python hex version as a constant.
const unsigned long Py_Version = PY_VERSION_HEX;