python - 我如何确定 platform.release() 的可能返回值

标签 python platform

我有一个程序,我们创建了一个用于分发的 exe。我的客户运行 XP、Vista 和 7。我们试图通过调整日志文件在 Win7 和 Vista 中写入的位置来简化安装,因为我们不必在 XP 中担心这一点。我们正在尝试使用 platform.release() 来决定将日志文件写入何处。如果不是 XP,那么我们会将日志文件写入 os.environ["LOCALAPPDATA"] 指定的位置。

我只是想确保在 XP 机器上运行时我们只会得到“XP”作为返回值,对于 Vista 和 7 我们也只会得到那些预期的结果。例如,是否有某种 XP 版本会返回 XP.v2(我编的)?

我们已经用 Google 搜索了答案,但找不到任何具体到足以确定的答案。

感谢您的帮助。 干杯

最佳答案

可以在 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 机器上看到“XP”以外的 release 值。

关于python - 我如何确定 platform.release() 的可能返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6820040/

相关文章:

android - ionic 2 : Add platform doesn't work

python - 将函数应用于元组数组

python - 确定多个数据框在 Pandas 中是否具有相同的列名

python - 在 Pandas 中用 NaN 替换多列中的多个字符串和数字

c# - x86 DLL 有效但 x64 DLL 无效

Android - 有没有办法让 platform.pk8 和 platform.x509.pem 与 rom 签名?

python - Mac OSX 10.12.6 上的 Flask mysql 连接错误

python - 将不同的随机列表分配给两个变量的最短方法是什么?

android - 为什么 Android API 级别 9 已过时?

swing - 如何在 JEditorPane 中使用 Netbeans 平台语法高亮?