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文件
您有一个用于解析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是很常见的. ,你也应该为其他惊喜做好准备.
我们使用此代码从可执行文件之一中提取版本,以便在其他程序中使用。
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 平台(这可能是也可能不是最终项目中的重要因素)。