什么是“版本文件”的样子?

我已经使用这个多年,现在没有结果。 PyInstaller手册说:

 --version-file =文件
    从文件添加一个版本资源到exe文件

听起来不错。 我想把版本信息放在我的可执行文件中。 问题是,我不知道“版本文件”是什么样子,我找不到一个我可以使用的例子。 我会考虑一个版本文件的例子作为这个问题的可接受的答案。


我试过了

手册还说:


只有Windows NT家族。 版本= 'myversion.txt'。 使用GrabVersion.py从可执行文件中窃取版本资源,然后编辑输出以创build自己的。 (版本资源的语法太神秘了,我不会试图从头开始编写一个。)

我已经尝试过从我的系统中无数的可执行文件。 我只是不断收到这些错误:

 回溯(最近一次通话最后):
  文件“C:\ pyinstaller-2.0 \ utils \ GrabVersion.py”,第42行, 
     vs = versioninfo.decode(sys.argv [1])
  在解码的文件“C:\ pyinstaller-2.0 \ PyInstaller \ utils \ versioninfo.py”,第33行
     nm = win32api.EnumResourceNames(h,RT_VERSION)[0]
 IndexError:列表索引超出范围 

在没有版本信息的可执行文件上,并且:

 回溯(最近一次通话最后):
  文件“C:\ pyinstaller-2.0 \ utils \ GrabVersion.py”,第43行, 
    打印vs
  在__repr__文件“C:\ pyinstaller-2.0 \ PyInstaller \ utils \ versioninfo.py”,第147行
     %(indent,self.ffi .__ repr __(indent),indent,
  在__repr__文件“C:\ pyinstaller-2.0 \ PyInstaller \ utils \ versioninfo.py”,第251行
     “filevers =%s”,%fv,
 TypeError:不是在string格式化过程中转换的所有参数 

其余的。

只是看了一下资料。 看来,版本文件预计是Python源自身作为提供的版本文件与读取,然后eval

GrabVersion.py脚本似乎已经找到了错误,所以我修改了__repr__函数以手动将元组参数转换为字符串。

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设置版本资源,所以我不确定这是否可行,我会对你的反馈感兴趣。

我在Python 3中遇到Pyinstaller –version-file选项的问题,我使用简单版本资源工具来解决它。

使用此工具,您可以显示任何版本资源的内容,只需使用/ 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"

使用较早的答案创建您的版本文件,将其保存为version.rc

找到filename.spec文件打开它。 接下来在该脚本中找到:

 exe = EXE(pyz,...) 

在整个部分的末尾添加这段代码,以便将版本信息自动嵌入到您的exe文件中

 version='version.rc' 

保存它,然后再次启动pyinstaller,这次使用下面的代码运行安装程序:

 pyinstaller filename.spec 

这不仅会创建exe文件本身,还包括所有的版本信息。

如果你没有想到它,用你的程序的文件名替换filename

请注意,版本文件是一个Python代码,所以你可以给它一个.py扩展名,以便在你的IDE中很好的看到它的格式,检查错误(当然,忽略未解决的引用),以及做Python允许的任何东西做。