【问题标题】:How can I be sure of the possible return values for platform.release()如何确定 platform.release() 的可能返回值
【发布时间】:2011-07-25 17:33:48
【问题描述】:

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

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

我们在谷歌上搜索了答案,但找不到任何足够具体的东西来确定。

感谢您的帮助。 干杯

【问题讨论】:

  • 作为一种替代方法,是否可以有一个案例:if "LOCALAPPDATA" not in os.environ:
  • @altie 谢谢我担心 LOCALAPPDATA 在某些设置中可能不存在作为添加的安全层,所以我想确定我知道如果 WIN7 而不是 LOCALAPPDATA 该怎么办
  • 请注意,您应该使用 ShGetFolderPath 等 shell 函数获取本地 appdata 之类的内容。这将始终提供正确的结果。那么你也不需要担心操作系统。 (请参阅this 之类的内容了解如何操作。)

标签: python platform


【解决方案1】:

可以在 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 可能是稳定的,但操作系统可能会改变,但我没有。但我看到它处理了最后一个 else 语句的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-10
  • 1970-01-01
  • 2021-04-30
  • 1970-01-01
  • 2012-08-14
  • 2012-07-12
相关资源
最近更新 更多