I’ve been googling this for ages now without results. The PyInstaller manual says:
--version-file=FILE
add a version resource from FILE to the exe
That sounds nice. I want to put version information in my executables. The problem is that I have no clue what a “version file” looks like and I can’t find a single example of one that I can use. I would consider an example of a version file as an acceptable answer to this question.
What I’ve tried
The manual also says:
version
Windows NT family only. version=’myversion.txt’. Use
GrabVersion.py to steal a version resource from an executable, and
then edit the ouput to create your own. (The syntax of version
resources is so arcane that I wouldn’t attempt to write one from
scratch.)
I have attempted this with countless executable files from my system now. I just keep getting these errors:
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
on executables that has no version information, and:
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
On the rest.
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.pyscript appears to generate errors as you’ve already found, so I modified the__repr__function ofFixedFileInfoto manually convert tuple arguments to strings.The Windows
cmd.exehas a Windows version resource embedded, here’s the output fromGrabVersion.pywhich you would save to a file and feed to PyInstaller.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.