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

时间:2013-01-31 11:06:36

标签: python windows pyinstaller

我一直在谷歌上搜索这段时间而没有结果。 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

其余的。

5 个答案:

答案 0 :(得分:27)

快速浏览一下消息来源。看来版本文件应该是Python源本身作为提供的版本文件,然后读取eval'。

GrabVersion.py脚本似乎会生成您已经找到的错误,因此我修改了__repr__的{​​{1}}函数以手动将元组参数转换为字符串。

Windows FixedFileInfo嵌入了Windows版本资源,这里是cmd.exe的输出,您可以将其保存到文件并提供给PyInstaller。

GrabVersion.py

我没有尝试使用PyInstaller设置版本资源,所以我不确定这是否有用,我对你的反馈感兴趣。

答案 1 :(得分:5)

我可能在之前的答案中忽略了这一点,或者PyInstaller已经更新,因为最初提供了这些答案,但PyInstaller的当前文档使用PyInstaller提供的命令行工具教授fairly simple method for this(尽管我最初几次看到文档时错过了这一部分。

将此工具指向系统上具有“漂亮外观”版本信息的.exe文件,它将创建一个人类可读,评论,可编辑的版本资源文件,您可以将其用作起点。

pyi-grab_version executable_with_version_resource

默认情况下将文件file_version_info.txt写入工作目录。

在我的本地svn.exe副本上运行上面的内容会产生:

# UTF-8
#
# For more details about fixed file info 'ffi' see:
# http://msdn.microsoft.com/en-us/library/ms646997.aspx
VSVersionInfo(
  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'r
mask=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 fileType
subtype=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])])
  ]
)

根据您的目的编辑此内容,并将其作为--version-file反馈给PyInstaller,例如

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

答案 2 :(得分:3)

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

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

exe = EXE(pyz,...)

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

version='version.rc'

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

pyinstaller filename.spec 

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

如果您可能没有考虑过,请将filename替换为您的程序文件名

答案 3 :(得分:2)

我在Python 3中遇到了Pyinstaller - version-file 选项的问题,我使用Simple Version Resource Tool解决了这个问题。

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

答案 4 :(得分:0)

请注意,版本文件是Python代码,因此您可以为其提供.py扩展名,以便在IDE中很好地查看格式,以检查错误(当然,忽略未解析的引用),以及做任何Python允许你做的事。