<p>微软改变了version函数的行为方式。有关更多信息,请参见<a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms724451%28v=vs.85%29.aspx" rel="nofollow">this page</a>。在</p>
<p>我解决这个问题的方法是使用ctypes和内核模式函数<a href="http://msdn.microsoft.com/en-us/library/windows/hardware/ff561910%28v=vs.85%29.aspx" rel="nofollow">RtlGetVersion</a>。尽管这是一个内核模式函数,但它可以从用户模式调用。我在很多版本的Windows上都试过了,但都没有问题。在</p>
<pre class="lang-py prettyprint-override"><code>import ctypes
class OSVERSIONINFOEXW(ctypes.Structure):
_fields_ = [('dwOSVersionInfoSize', ctypes.c_ulong),
('dwMajorVersion', ctypes.c_ulong),
('dwMinorVersion', ctypes.c_ulong),
('dwBuildNumber', ctypes.c_ulong),
('dwPlatformId', ctypes.c_ulong),
('szCSDVersion', ctypes.c_wchar*128),
('wServicePackMajor', ctypes.c_ushort),
('wServicePackMinor', ctypes.c_ushort),
('wSuiteMask', ctypes.c_ushort),
('wProductType', ctypes.c_byte),
('wReserved', ctypes.c_byte)]
def get_os_version():
"""
Get's the OS major and minor versions. Returns a tuple of
(OS_MAJOR, OS_MINOR).
"""
os_version = OSVERSIONINFOEXW()
os_version.dwOSVersionInfoSize = ctypes.sizeof(os_version)
retcode = ctypes.windll.Ntdll.RtlGetVersion(ctypes.byref(os_version))
if retcode != 0:
raise Exception("Failed to get OS version")
return os_version.dwMajorVersion, os_version.dwMinorVersion
</code></pre>