Как я могу быть уверен в возможных возвращаемых значениях для platform.release () - PullRequest
1 голос
/ 25 июля 2011

У меня есть программа, с которой мы создаем исполняемый файл для распространения. Мои клиенты используют XP и Vista и 7. Мы пытаемся упростить установку, настроив место записи файла журнала в Win7 и Vista, так как нам не пришлось беспокоиться об этом в XP. Мы пытаемся использовать platform.release(), чтобы затем решить, куда записать файл журнала. Если это не XP, то мы запишем файл журнала в папку, указанную os.environ["LOCALAPPDATA"].

Я просто пытаюсь убедиться, что при работе на машине с XP мы получим только «XP» в качестве возвращаемого значения, для Vista и 7 мы также получим только те ожидаемые результаты. Например, есть ли какая-нибудь разновидность XP, которая будет возвращать XP.v2 (я это придумал)?

Мы нашли Google для ответа и не можем найти что-то достаточно конкретное, чтобы быть уверенным.

Спасибо за любую помощь. Приветствия

1 Ответ

4 голосов
/ 25 июля 2011

Окончательный ответ можно найти в исходном коде точной версии вашего интерпретатора 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

После прочтения этого кода я не ожидаю увидеть значение release, отличное от 'XP 'на Windows XP.

...