What does a "version file" look like? What does a "version file" look like? python python

What does a "version file" look like?


Just had a quick look at the sources. It appears that the version file is expected to be Python source itself as the provided version file with be read and then eval'ed.

The GrabVersion.py script appears to generate errors as you've already found, so I modified the __repr__ function of FixedFileInfo to manually convert tuple arguments to strings.

The Windows cmd.exe has a Windows version resource embedded, here's the output from GrabVersion.py which you would save to a file and feed to 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])])  ])

I haven't tried setting a version resource with PyInstaller so I'm not sure if this will work, I'd be interested in your feedback.


I might be missing this in the previous answers, or maybe PyInstaller has been updated since these answers were originally provided, but the current docs for PyInstaller teach a fairly simple method for this using a command-line tool provided with PyInstaller (though I missed this section the first few times I looked to the docs).

Point this tool at an .exe file on your system that has "good looking" version info, and it will create a human-readable, commented, editable version resource file that you can use as a starting point.

pyi-grab_version executable_with_version_resource

which by default writes a file file_version_info.txt to the working directory.

Running the above on my local copy of svn.exe produces:

# UTF-8## For more details about fixed file info 'ffi' see:# http://msdn.microsoft.com/en-us/library/ms646997.aspxVSVersionInfo(  ffi=FixedFileInfo(# filevers and prodvers should be always a tuple with four items: (1, 2, 3, 4)# Set not needed items to zero 0.filevers=(1, 9, 7, 30920),prodvers=(1, 9, 7, 30920),# Contains a bitmask that specifies the valid bits 'flags'rmask=0x3f,# Contains a bitmask that specifies the Boolean attributes of the file.flags=0x0,# The operating system for which this file was designed.# 0x4 - NT and there is no need to change it.OS=0x4,# The general type of file.# 0x1 - the file is an application.fileType=0x1,# The function of the file.# 0x0 - the function is not defined for this fileTypesubtype=0x0,# Creation date and time stamp.date=(0, 0)),  kids=[StringFileInfo(  [  StringTable(    u'040904B0',    [StringStruct(u'CompanyName', u'Apache Software Foundation'),    StringStruct(u'FileDescription', u'svn'),    StringStruct(u'FileVersion', u'1.9.7'),    StringStruct(u'InternalName', u'SVN'),    StringStruct(u'LegalCopyright', u'Copyright (c) The Apache Software Foundation'),    StringStruct(u'OriginalFilename', u'svn.exe'),    StringStruct(u'ProductName', u'Subversion'),    StringStruct(u'ProductVersion', u'1.9.7 (r1800392)')])  ]), VarFileInfo([VarStruct(u'Translation', [1033, 1200])])  ])

edit this to your purpose, and feed it back to PyInstaller as a --version-file, e.g.

pyinstaller [options] myscript.py --version-file file_version_info.txt


Create your Version file using an earlier answer save it as version.rc

Locate the filename.spec file open it.next in that script, locate the:

exe = EXE(pyz,...)

at the end of that entire section add this piece of code to automatically embed the version information on your exe file

version='version.rc'

Save it and then launch pyinstaller again and this time run the installer using this code:

pyinstaller filename.spec 

this will not only create the exe file itself but also include all of your version information as well.

In case you may not have thought about it, replace the filename with your program's filename