Нашли версию приложения из Python? - PullRequest
1 голос
/ 16 февраля 2010

В основном я пытаюсь выяснить, какую версию ArcGIS установил пользователь, я просмотрел реестр и не смог найти ничего, связанного со строкой версии. Однако я знаю, что он хранится в .exe.

Я немного погуглил и не могу найти ничего действительно стоящего. Я попытался использовать GetFileVersionInfo, и я, кажется, получил случайную путаницу вещей.

Есть идеи?

EDIT

Вздох ....

Оказывается, pywin32 не всегда устанавливается на все машины. Кто-нибудь знает, возможно ли сделать то же самое через ctypes?

Также это только для Windows.

Ответы [ 2 ]

2 голосов
/ 18 марта 2010

Если вы предпочитаете не делать это с помощью pywin32, вы наверняка сможете сделать это с помощью ctypes.

Хитрость в том, чтобы декодировать ту глупую структуру версий файлов, которая возвращается.

Есть одна старая запись в списке рассылки , которая делает то, что вы просите. К сожалению, у меня нет коробки с окнами, чтобы проверить это сам, прямо сейчас. Но если это не сработает, это должно как минимум дать вам хорошее начало.

Вот код, если эти архивы 2006 года когда-нибудь исчезнут:

import array
from ctypes import *

def get_file_info(filename, info):
    """
    Extract information from a file.
    """
    # Get size needed for buffer (0 if no info)
    size = windll.version.GetFileVersionInfoSizeA(filename, None)
    # If no info in file -> empty string
    if not size:
        return ''
    # Create buffer
    res = create_string_buffer(size)
    # Load file informations into buffer res
    windll.version.GetFileVersionInfoA(filename, None, size, res)
    r = c_uint()
    l = c_uint()
    # Look for codepages
    windll.version.VerQueryValueA(res, '\\VarFileInfo\\Translation',
                                  byref(r), byref(l))
    # If no codepage -> empty string
    if not l.value:
        return ''
    # Take the first codepage (what else ?)
    codepages = array.array('H', string_at(r.value, l.value))
    codepage = tuple(codepages[:2].tolist())
    # Extract information
    windll.version.VerQueryValueA(res, ('\\StringFileInfo\\%04x%04x\\'
+ info) % codepage, byref(r), byref(l))
    return string_at(r.value, l.value)

print get_file_info(r'C:\WINDOWS\system32\calc.exe', 'FileVersion')

-

Ладно - обратно возле окна. На самом деле попробовал этот код сейчас. «У меня работает».

>>> print get_file_info(r'C:\WINDOWS\system32\calc.exe', 'FileVersion')
6.1.7600.16385 (win7_rtm.090713-1255)
0 голосов
/ 16 февраля 2010

есть утилита gnu linux под названием 'strings', которая печатает печатаемые символы в любом файле (двоичном или недвоичном), попробуйте использовать его и найдите номер версии, например,

на окнах, вы можете получить строки здесь http://unxutils.sourceforge.net/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...