Python窗口文件版本属性

上次我问了一个类似的问题,但那是关于svn相关的版本信息。 现在我想知道如何查询关于例如Windows的“文件版本”属性。 一个DLL。 我注意到wmi和win32file模块也没有成功。

这是一个函数,它读取所有的文件属性作为一个字典:

import win32api #============================================================================== def getFileProperties(fname): #============================================================================== """ Read all properties of the given file return them as a dictionary. """ propNames = ('Comments', 'InternalName', 'ProductName', 'CompanyName', 'LegalCopyright', 'ProductVersion', 'FileDescription', 'LegalTrademarks', 'PrivateBuild', 'FileVersion', 'OriginalFilename', 'SpecialBuild') props = {'FixedFileInfo': None, 'StringFileInfo': None, 'FileVersion': None} try: # backslash as parm returns dictionary of numeric info corresponding to VS_FIXEDFILEINFO struc fixedInfo = win32api.GetFileVersionInfo(fname, '\\') props['FixedFileInfo'] = fixedInfo props['FileVersion'] = "%d.%d.%d.%d" % (fixedInfo['FileVersionMS'] / 65536, fixedInfo['FileVersionMS'] % 65536, fixedInfo['FileVersionLS'] / 65536, fixedInfo['FileVersionLS'] % 65536) # \VarFileInfo\Translation returns list of available (language, codepage) # pairs that can be used to retreive string info. We are using only the first pair. lang, codepage = win32api.GetFileVersionInfo(fname, '\\VarFileInfo\\Translation')[0] # any other must be of the form \StringfileInfo\%04X%04X\parm_name, middle # two are language/codepage pair returned from above strInfo = {} for propName in propNames: strInfoPath = u'\\StringFileInfo\\%04X%04X\\%s' % (lang, codepage, propName) ## print str_info strInfo[propName] = win32api.GetFileVersionInfo(fname, strInfoPath) props['StringFileInfo'] = strInfo except: pass return props 

最好添加一个try /除非文件没有版本号属性。

filever.py

 from win32api import GetFileVersionInfo, LOWORD, HIWORD def get_version_number (filename): try: info = GetFileVersionInfo (filename, "\\") ms = info['FileVersionMS'] ls = info['FileVersionLS'] return HIWORD (ms), LOWORD (ms), HIWORD (ls), LOWORD (ls) except: return 0,0,0,0 if __name__ == '__main__': import os filename = os.environ["COMSPEC"] print ".".join ([str (i) for i in get_version_number (filename)]) 

yourscript.py:

 import os,filever myPath="C:\\path\\to\\check" for root, dirs, files in os.walk(myPath): for file in files: file = file.lower() # Convert .EXE to .exe so next line works if (file.count('.exe') or file.count('.dll')): # Check only exe or dll files fullPathToFile=os.path.join(root,file) major,minor,subminor,revision=filever.get_version_number(fullPathToFile) print "Filename: %s \t Version: %s.%s.%s.%s" % (file,major,minor,subminor,revision) 

干杯!

这是一个也可以在非Windows环境下使用pefile-module的版本 :

 import pefile def LOWORD(dword): return dword & 0x0000ffff def HIWORD(dword): return dword >> 16 def get_product_version(path): pe = pefile.PE(path) #print PE.dump_info() ms = pe.VS_FIXEDFILEINFO.ProductVersionMS ls = pe.VS_FIXEDFILEINFO.ProductVersionLS return (HIWORD (ms), LOWORD (ms), HIWORD (ls), LOWORD (ls)) if __name__ == "__main__": import sys try: print "%d.%d.%d.%d" % get_product_version(sys.argv[1]) except: print "Version info not available. Maybe the file is not a Windows executable" 

您可以使用http://sourceforge.net/projects/pywin32/中的pyWin32模块:

 from win32com.client import Dispatch ver_parser = Dispatch('Scripting.FileSystemObject') info = ver_parser.GetFileVersion(path) if info == 'No Version Information Available': info = None 

我在“timgolden”网站找到了这个解决方案。 工作正常。

 from win32api import GetFileVersionInfo, LOWORD, HIWORD def get_version_number (filename): info = GetFileVersionInfo (filename, "\\") ms = info['FileVersionMS'] ls = info['FileVersionLS'] return HIWORD (ms), LOWORD (ms), HIWORD (ls), LOWORD (ls) if __name__ == '__main__': import os filename = os.environ["COMSPEC"] print ".".join ([str (i) for i in get_version_number (filename)]) 

您可以使用filever.exe工具来做到这一点。 这里解释了如何从Python中完成的线程。 这里是关于该工具的知识库文章 。

这是一个不需要额外的库的版本。 我不能像大家所说的那样使用win32api:

来自: https : //mail.python.org/pipermail//python-list/2006-November/402797.html

只有在原件丢失的情况下才复制。

 import array from ctypes import * def get_file_info(filename, info): """ Extract information from a file. """ # Get size needed for buffer (0 if no info) size = windll.version.GetFileVersionInfoSizeA(filename, None) # If no info in file -> empty string if not size: return '' # Create buffer res = create_string_buffer(size) # Load file informations into buffer res windll.version.GetFileVersionInfoA(filename, None, size, res) r = c_uint() l = c_uint() # Look for codepages windll.version.VerQueryValueA(res, '\\VarFileInfo\\Translation', byref(r), byref(l)) # If no codepage -> empty string if not l.value: return '' # Take the first codepage (what else ?) codepages = array.array('H', string_at(r.value, l.value)) codepage = tuple(codepages[:2].tolist()) # Extract information windll.version.VerQueryValueA(res, ('\\StringFileInfo\\%04x%04x\\' + info) % codepage, byref(r), byref(l)) return string_at(r.value, l.value) 

像这样使用:

  print get_file_info(r'C:\WINDOWS\system32\calc.exe', 'FileVersion')