查找二进制文件的版本

ins*_*get 1 python binaryfiles version

有谁知道我怎么能找到传递给我的函数的二进制文件的版本?

我从这个页面得到以下代码:

def version(fpath):
    f = open(fpath, 'rb')

    s = f.read(1024)
    print s

    f.close()
Run Code Online (Sandbox Code Playgroud)

但是,这并没有给我任何类似于上述网站显示的有用输出.

编辑:@BoazYaniv告诉我文件格式在这个问题中起着重要作用.这是一个Windows EXE文件

Boa*_*niv 7

您有一个用于解析EXE文件的现成模块:http: //code.google.com/p/pefile/

您可以使用以下代码阅读它:

import pefile

pe = pefile.PE(r'C:\Windows\notepad.exe')
FileVersion    = pe.FileInfo[0].StringTable[0].entries['FileVersion']
ProductVersion = pe.FileInfo[0].StringTable[0].entries['ProductVersion']
Run Code Online (Sandbox Code Playgroud)

如您所见,Windows EXE(和DLL)文件存储两种不同的版本,FileVersion和ProductVersion.很多时候它们是相同的,但有时它们可​​能不同 - 这完全取决于真正制造EXE的人.

编辑:

只是为了使事情变得更复杂,PE字符串表中的这两个字符串不是Windows编译器可以保存版本的唯一地方.EXE中存储了两个附加的FileVersion和ProductVersion值,只有它们存储为32位整数对,每个整数都被分成两个16位整数(Windows API中的WORD).总而言之,每个版本值(FileVersion和ProductVersion)都有4个16位WORD,它们代表版本的点分隔部分.您也可以使用pefile获取它们:

pe = pefile.PE(r'C:\Windows\notepad.exe')
FileVersionLS    = pe.VS_FIXEDFILEINFO.FileVersionLS
FileVersionMS    = pe.VS_FIXEDFILEINFO.FileVersionMS
ProductVersionLS = pe.VS_FIXEDFILEINFO.ProductVersionLS
ProductVersionMS = pe.VS_FIXEDFILEINFO.ProductVersionMS

FileVersion = (FileVersionMS >> 16, FileVersionMS & 0xFFFF, FileVersionLS >> 16, FileVersionLS & 0xFFFF)
ProductVersion = (ProductVersionMS >> 16, ProductVersionMS & 0xFFFF, ProductVersionLS >> 16, ProductVersionLS & 0xFFFF)

print 'File version:    %s.%s.%s.%s' % FileVersion 
print 'Product version: %s.%s.%s.%s' % ProductVersion
Run Code Online (Sandbox Code Playgroud)

可是等等!这不是全部:您至少还有一个可以查找版本的地方:在另一个名为OPTIONAL_HEADER的结构中,您可以找到另外两个名为MajorImageVersion和MinorImageVersion的值.它们代表整个版本的两个第一部分,因此具有ProductVersion或FileVersion(例如6.1.7600.150)的文件通常具有MajorImageVersion为6且MinorImageVersion为1.您可以使用pe.OPTIONAL_HEADER.MajorImageVersion和获取它们pe.OPTIONAL_HEADER.MinorImageVersion.

所有这些值(5个不同的值,如果我把它们算得正确)通常是等价的(如果你忽略了字符串表中有时会有的额外的自由形式字符串值),但是看到不同的FileVersions和ProductVersions是很常见的. ,你也应该为其他惊喜做好准备.

  • +1这是一个非常好的黑客。遗憾的是我的经理不让我使用它 (2认同)
  • 稍作修改,`pe.VS_FIXEDFILEINFO.FileVersionLS`应该是`pe.VS_FIXEDFILEINFO[0].FileVersionLS`等等。因为它们是列表。在这个旧版本中可能不是这样! (2认同)

g.d*_*d.c 5

我们使用此代码从可执行文件之一中提取版本,以便在其他程序中使用。

import win32api

try:
    info = win32api.GetFileVersionInfo('rpmsrv.exe', "\\")
    ms = info['FileVersionMS']
    ls = info['FileVersionLS']
    __version__ = "%d.%d.%d.%d" % (win32api.HIWORD(ms), win32api.LOWORD (ms),
                                 win32api.HIWORD (ls), win32api.LOWORD (ls))
except:
    __version__ = '5.1.1.000' # some appropriate default here.
Run Code Online (Sandbox Code Playgroud)

--- 包含评论 ---

这需要安装 Windows Bindings for Python。它们可以在这里找到: http: //starship.python.net/~skippy/win32/。这也限制了该解决方案只能用于 Windows 平台(这可能是也可能不是最终项目中的重要因素)。

  • 不错的替代方案,但您应该添加注释,这需要 Python 的 Windows 扩展,并且它只能在 Windows 上运行(因为它使用 Windows API,而不是直接解析文件)。 (2认同)