我一直在谷歌上搜索这段时间而没有结果。 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
其余的。
答案 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允许你做的事。