Как выглядит "файл версии"?

Я уже много лет искал это без каких-либо результатов. В руководстве PyInstaller говорится:

--version-file=FILE
    add a version resource from FILE to the exe

Звучит неплохо. Я хочу поместить информацию о версии в свои исполняемые файлы. Проблема в том, что я не знаю, как выглядит "файл версии", и я не могу найти ни одного примера, который я могу использовать. Я бы рассмотрел пример файла версии как приемлемый ответ на этот вопрос.


Что я пробовал

В руководстве также говорится:

версия
Только для Windows NT. версия = 'myversion.txt. использование GrabVersion.py, чтобы украсть ресурс версии из исполняемого файла и затем отредактируйте вывод, чтобы создать свой собственный. (Синтаксис версии ресурсы настолько загадочны, что я не буду пытаться писать один из них царапина.)

Я попытался сделать это с бесчисленными исполняемыми файлами из моей системы. Я просто продолжаю получать эти ошибки:

Traceback (most recent call last):
  File "C:\pyinstaller-2.0\utils\GrabVersion.py", line 42, in 
    vs  = versioninfo.decode(sys.argv[1])
  File "C:\pyinstaller-2.0\PyInstaller\utils\versioninfo.py", line 33, in decode
    nm = win32api.EnumResourceNames(h, RT_VERSION)[0]
IndexError: list index out of range

для исполняемых файлов, которые не имеют информации о версии, и:

Traceback (most recent call last):
  File "C:\pyinstaller-2.0\utils\GrabVersion.py", line 43, in 
    print vs
  File "C:\pyinstaller-2.0\PyInstaller\utils\versioninfo.py", line 147, in __repr__
    % (indent, self.ffi.__repr__(indent), indent,
  File "C:\pyinstaller-2.0\PyInstaller\utils\versioninfo.py", line 251, in __repr__
    "filevers=%s," % fv,
TypeError: not all arguments converted during string formatting

В остальном.

Ответ 1

Просто взглянул на источники. Похоже, что файл версии, как ожидается, будет источником Python, так как предоставленный файл версии должен быть прочитан, а затем eval 'ed.

GrabVersion.py script, как представляется, генерирует ошибки, как вы уже нашли, поэтому я изменил функцию __repr__ FixedFileInfo, чтобы вручную преобразовать аргументы кортежа в строки.

Windows cmd.exe имеет встроенный ресурс версии Windows, здесь вывод из GrabVersion.py, который вы сохранили бы в файле и подали в PyInstaller.

VSVersionInfo(
  ffi=FixedFileInfo(
    filevers=(6, 1, 7601, 17514),
    prodvers=(6, 1, 7601, 17514),
    mask=0x3f,
    flags=0x0,
    OS=0x40004,
    fileType=0x1,
    subtype=0x0,
    date=(0, 0)
    ),
  kids=[
    StringFileInfo(
      [
      StringTable(
        u'040904B0',
        [StringStruct(u'CompanyName', u'Microsoft Corporation'),
        StringStruct(u'FileDescription', u'Windows Command Processor'),
        StringStruct(u'FileVersion', u'6.1.7601.17514 (win7sp1_rtm.101119-1850)'),
        StringStruct(u'InternalName', u'cmd'),
        StringStruct(u'LegalCopyright', u'\xa9 Microsoft Corporation. All rights reserved.'),
        StringStruct(u'OriginalFilename', u'Cmd.Exe'),
        StringStruct(u'ProductName', u'Microsoft\xae Windows\xae Operating System'),
        StringStruct(u'ProductVersion', u'6.1.7601.17514')])
      ]), 
    VarFileInfo([VarStruct(u'Translation', [1033, 1200])])
  ]
)

Я не пробовал устанавливать ресурс версии с PyInstaller, поэтому я не уверен, что это сработает, меня бы заинтересовала ваша обратная связь.

Ответ 2

У меня были проблемы с параметром Pyinstaller --version-file в Python 3, и я решаю его с помощью Простой инструмент ресурса версии.

С помощью этого инструмента вы можете показать содержимое любого ресурса версии, просто используйте параметр /vo с любым исполняемым файлом: verpatch.exe /vo c:\Windows\System32\cmd.exe

Чтобы добавить ресурс версии новый в исполняемый файл, просто следуйте этому примеру:

verpatch.exe script.exe 1.0.0.0 /va /pv 1.0.0.0 /s description "Your product description" /s product "Your product name" /s copyright "Your company name, 2016" /s company "Your company name"

Ответ 3

Создайте свой файл версии, используя более ранний ответ, сохраните его как version.rc

Найдите файл filename.spec, чтобы открыть его. затем в script, найдите:

exe = EXE(pyz,...)

в конце всего этого раздела добавьте этот фрагмент кода, чтобы автоматически вставлять информацию о версии в ваш EXE файл.

version='version.rc'

Сохраните его, а затем снова запустите pyinstaller и на этот раз запустите установщик с помощью этого кода:

pyinstaller filename.spec 

это не только создаст сам файл exe, но также включит всю вашу информацию о версии.

Если вы, возможно, и не подумали об этом, замените filename на ваше имя файла программы

Ответ 4

Обратите внимание, что файл версии - это код Python, поэтому вы можете предоставить ему расширение .py, чтобы оно было хорошо отформатировано в вашей среде IDE, чтобы проверить наличие ошибок (не обращайте внимания на Unresolved References, конечно) и делать что угодно Python позволяет вам делать.