Я хочу использовать Python, чтобы получить исполняемый файл версии, и я знаю pefile.pyс помощью «pefile.py», чтобы получить файл (.exe) версию
, как использовать его, чтобы сделать это?
замечания: исполняемый файл может быть неполным.
Я хочу использовать Python, чтобы получить исполняемый файл версии, и я знаю pefile.pyс помощью «pefile.py», чтобы получить файл (.exe) версию
, как использовать его, чтобы сделать это?
замечания: исполняемый файл может быть неполным.
Номера версий программ Windows хранятся в разделе ресурсов файла программы, а не в заголовке формата PE. Я не знаком с pefile.py
, поэтому я не знаю, обрабатывает ли он непосредственно разделы ресурсов. Если нет, вы сможете найти необходимую информацию для этого в this MSDN article.
Предполагая, что «версия исполняемого файла» означает a) в Windows, b) информацию, указанную на вкладке «Свойства», «Сведения», в разделе «Версия файла», вы можете получить ее с помощью пакета pywin32 с помощью следующей команды: :
>>> import win32api as w
>>> hex(w.GetFileVersionInfo('c:/windows/regedit.exe', '\\')['FileVersionMS'])
'0x60000'
>>> hex(w.GetFileVersionInfo('c:/windows/regedit.exe', '\\')['FileVersionLS'])
'0x17714650'
Обратите внимание, что 0x60000 имеет основные/незначительные количества (6.0) и 0x17714650 является следующий два, которые, если рассматривать как два отдельных слова (0x1771 и 0x4650 или 6001 и 18000 в десятичной системе) соответствуют значениям на моей машине, где версия regedit 6.0.6001.18000.
Вот пример скрипта, который делает то, что вы хотите:
import sys
def main(pename):
from pefile import PE
pe = PE(pename)
if not 'VS_FIXEDFILEINFO' in pe.__dict__:
print "ERROR: Oops, %s has no version info. Can't continue." % (pename)
return
if not pe.VS_FIXEDFILEINFO:
print "ERROR: VS_FIXEDFILEINFO field not set for %s. Can't continue." % (pename)
return
verinfo = pe.VS_FIXEDFILEINFO
filever = (verinfo.FileVersionMS >> 16, verinfo.FileVersionMS & 0xFFFF, verinfo.FileVersionLS >> 16, verinfo.FileVersionLS & 0xFFFF)
prodver = (verinfo.ProductVersionMS >> 16, verinfo.ProductVersionMS & 0xFFFF, verinfo.ProductVersionLS >> 16, verinfo.ProductVersionLS & 0xFFFF)
print "Product version: %d.%d.%d.%d" % prodver
print "File version: %d.%d.%d.%d" % filever
if __name__ == '__main__':
if len(sys.argv) != 2:
sys.stderr.write("ERROR:\n\tSyntax: verinfo <pefile>\n")
sys.exit(1)
sys.exit(main(sys.argv[1]))
Соответствующие линии являются:
verinfo = pe.VS_FIXEDFILEINFO
filever = (verinfo.FileVersionMS >> 16, verinfo.FileVersionMS & 0xFFFF, verinfo.FileVersionLS >> 16, verinfo.FileVersionLS & 0xFFFF)
prodver = (verinfo.ProductVersionMS >> 16, verinfo.ProductVersionMS & 0xFFFF, verinfo.ProductVersionLS >> 16, verinfo.ProductVersionLS & 0xFFFF)
все из которых происходит только после проверки того, что у нас есть что-то значимое в этих свойствах.
Спасибо C22 очень полезный совет –
Учитывая, что данный модуль не зависит от платформы, но ваш ответ зависит от модуля Win32. Вот почему я решил уменьшить ответ. – 0xC0000022L
0xC0000022L он упоминает pefile.py, но неясно, означает ли он, что это кросс-платформенный. Он ссылается на «.exe», который обычно является Windows. Кроме того, я сказал «предполагая, что вы имеете в виду Windows», поэтому было ясно, что мой ответ не должен был быть кросс-платформенным. Я думаю, что ваш downvote был преждевременным в лучшем случае (до того, как OP выяснит), но что угодно ... –
Модуль 'pefile' сам по себе является кросс-платформенным. – 0xC0000022L