https://github.com/python/cpython/commit/af49df919dafc3767ae956767dce0482f9cd6d4e
commit: af49df919dafc3767ae956767dce0482f9cd6d4e
branch: main
author: thexai <[email protected]>
committer: zooba <[email protected]>
date: 2026-08-18T19:55:57+01:00
summary:
gh-152433: Fix errors in sys.getwindowsversion() for UWP build (GH-152604)
files:
A Misc/NEWS.d/next/Windows/2026-06-29-17-17-10.gh-issue-152433.AhW--j.rst
M Lib/platform.py
M Python/sysmodule.c
diff --git a/Lib/platform.py b/Lib/platform.py
index 3141998e02dfe21..c4ef1c3eb20edf4 100644
--- a/Lib/platform.py
+++ b/Lib/platform.py
@@ -427,11 +427,16 @@ def _win32_ver(version, csd, ptype):
winver = getwindowsversion()
is_client = (getattr(winver, 'product_type', 1) == 1)
- try:
- version = _syscmd_ver()[2]
- major, minor, build = map(int, version.split('.'))
- except ValueError:
- major, minor, build = winver.platform_version or winver[:3]
+
+ if winver.device_family == "Desktop":
+ try:
+ version = _syscmd_ver()[2]
+ major, minor, build = map(int, version.split('.'))
+ except ValueError:
+ major, minor, build = winver.platform_version or winver[:3]
+ version = '{0}.{1}.{2}'.format(major, minor, build)
+ else:
+ major, minor, build = winver[:3]
version = '{0}.{1}.{2}'.format(major, minor, build)
# getwindowsversion() reflect the compatibility mode Python is
diff --git
a/Misc/NEWS.d/next/Windows/2026-06-29-17-17-10.gh-issue-152433.AhW--j.rst
b/Misc/NEWS.d/next/Windows/2026-06-29-17-17-10.gh-issue-152433.AhW--j.rst
new file mode 100644
index 000000000000000..47f4ff689bd60aa
--- /dev/null
+++ b/Misc/NEWS.d/next/Windows/2026-06-29-17-17-10.gh-issue-152433.AhW--j.rst
@@ -0,0 +1,2 @@
+Fix errors in :func:`sys.getwindowsversion` for Universal Windows Platform
+build.
diff --git a/Python/sysmodule.c b/Python/sysmodule.c
index 1e6e914b066bc5c..5051dfc3ec0f861 100644
--- a/Python/sysmodule.c
+++ b/Python/sysmodule.c
@@ -1633,6 +1633,7 @@ static PyStructSequence_Field windows_version_fields[] = {
{"suite_mask", "Bit mask identifying available product suites"},
{"product_type", "System product type"},
{"platform_version", "Diagnostic version number"},
+ {"device_family", "'Desktop', 'Xbox' or 'UWP'"},
{0}
};
@@ -1645,13 +1646,10 @@ static PyStructSequence_Desc windows_version_desc = {
via indexing, the rest are name only */
};
+#ifdef MS_WINDOWS_DESKTOP
static PyObject *
_sys_getwindowsversion_from_kernel32(void)
{
-#ifndef MS_WINDOWS_DESKTOP
- PyErr_SetString(PyExc_OSError, "cannot read version info on this
platform");
- return NULL;
-#else
HANDLE hKernel32;
wchar_t kernel32_path[MAX_PATH];
LPVOID verblock;
@@ -1688,8 +1686,8 @@ _sys_getwindowsversion_from_kernel32(void)
realBuild = HIWORD(ffi->dwProductVersionLS);
PyMem_RawFree(verblock);
return Py_BuildValue("(kkk)", realMajor, realMinor, realBuild);
-#endif /* !MS_WINDOWS_DESKTOP */
}
+#endif /* MS_WINDOWS_DESKTOP */
/* Disable deprecation warnings about GetVersionEx as the result is
being passed straight through to the caller, who is responsible for
@@ -1719,7 +1717,6 @@ sys_getwindowsversion_impl(PyObject *module)
{
PyObject *version;
int pos = 0;
- OSVERSIONINFOEXW ver;
if (PyObject_GetOptionalAttrString(module, "_cached_windows_version",
&version) < 0) {
return NULL;
@@ -1729,6 +1726,8 @@ sys_getwindowsversion_impl(PyObject *module)
}
Py_XDECREF(version);
+ OSVERSIONINFOEXW ver;
+ ZeroMemory(&ver, sizeof(ver));
ver.dwOSVersionInfoSize = sizeof(ver);
if (!GetVersionExW((OSVERSIONINFOW*) &ver))
return PyErr_SetFromWindowsErr(0);
@@ -1756,6 +1755,7 @@ sys_getwindowsversion_impl(PyObject *module)
SET_VERSION_INFO(PyLong_FromLong(ver.wSuiteMask));
SET_VERSION_INFO(PyLong_FromLong(ver.wProductType));
+#if defined(MS_WINDOWS_DESKTOP)
// GetVersion will lie if we are running in a compatibility mode.
// We need to read the version info from a system file resource
// to accurately identify the OS version. If we fail for any reason,
@@ -1775,6 +1775,14 @@ sys_getwindowsversion_impl(PyObject *module)
}
SET_VERSION_INFO(realVersion);
+ SET_VERSION_INFO(PyUnicode_FromString("Desktop"));
+#elif defined(MS_WINDOWS_GAMES)
+ SET_VERSION_INFO(Py_BuildValue("(kkk)", ver.dwMajorVersion,
ver.dwMinorVersion, ver.dwBuildNumber));
+ SET_VERSION_INFO(PyUnicode_FromString("Xbox"));
+#else
+ SET_VERSION_INFO(Py_BuildValue("(kkk)", ver.dwMajorVersion,
ver.dwMinorVersion, ver.dwBuildNumber));
+ SET_VERSION_INFO(PyUnicode_FromString("UWP"));
+#endif
#undef SET_VERSION_INFO
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]