如何确保platform.release()的返回值?

1 投票
1 回答
701 浏览
提问于 2025-04-16 22:14

我有一个程序,我们把它打包成exe文件来分发给用户。我的客户使用的是XP、Vista和7这几个系统。我们想让安装过程更简单,所以想调整在Vista和7中日志文件的保存位置,因为在XP中我们不需要考虑这个问题。我们打算用platform.release()来判断应该把日志文件写到哪里。如果不是XP系统,我们就把日志文件写到os.environ["LOCALAPPDATA"]指定的位置。

我只是想确保在XP机器上运行时,返回的值只会是'XP',而在Vista和7上也只会得到预期的结果。比如说,XP有没有可能返回XP.v2这种结果(我随便编的)?

我们在网上搜索过这个问题,但找不到足够具体的信息来确认。

谢谢大家的帮助。祝好!

1 个回答

4

想要找到确切的答案,可以查看你使用的Python解释器的源代码。我现在用的是CPython 2.7.1。这个源代码可以免费下载,下面是相关的代码(在Lib/platform.py文件中找到的):

winver = GetVersionEx()
maj,min,buildno,plat,csd = winver
version = '%i.%i.%i' % (maj,min,buildno & 0xFFFF)
if hasattr(winver, "service_pack"):
    if winver.service_pack != "":
        csd = 'SP%s' % winver.service_pack_major
else:
    if csd[:13] == 'Service Pack ':
        csd = 'SP' + csd[13:]

if plat == VER_PLATFORM_WIN32_WINDOWS:
    regkey = 'SOFTWARE\\Microsoft\\Windows\\CurrentVersion'
    # Try to guess the release name
    if maj == 4:
        if min == 0:
            release = '95'
        elif min == 10:
            release = '98'
        elif min == 90:
            release = 'Me'
        else:
            release = 'postMe'
    elif maj == 5:
        release = '2000'

elif plat == VER_PLATFORM_WIN32_NT:
    regkey = 'SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion'
    if maj <= 4:
        release = 'NT'
    elif maj == 5:
        if min == 0:
            release = '2000'
        elif min == 1:
            release = 'XP'
        elif min == 2:
            release = '2003Server'
        else:
            release = 'post2003'
    elif maj == 6:
        if hasattr(winver, "product_type"):
            product_type = winver.product_type
        else:
            product_type = VER_NT_WORKSTATION
            # Without an OSVERSIONINFOEX capable sys.getwindowsversion(),
            # or help from the registry, we cannot properly identify
            # non-workstation versions.
            try:
                key = RegOpenKeyEx(HKEY_LOCAL_MACHINE, regkey)
                name, type = RegQueryValueEx(key, "ProductName")
                # Discard any type that isn't REG_SZ
                if type == REG_SZ and name.find("Server") != -1:
                    product_type = VER_NT_SERVER
            except WindowsError:
                # Use default of VER_NT_WORKSTATION
                pass

        if min == 0:
            if product_type == VER_NT_WORKSTATION:
                release = 'Vista'
            else:
                release = '2008Server'
        elif min == 1:
            if product_type == VER_NT_WORKSTATION:
                release = '7'
            else:
                release = '2008ServerR2'
        else:
            release = 'post2008Server'

else:
    if not release:
        # E.g. Win3.1 with win32s
        release = '%i.%i' % (maj,min)
    return release,version,csd,ptype

看完这段代码后,我觉得在Windows XP的电脑上,release的值应该只会是'XP',不会有其他的。

撰写回答