- pyinstaller-versionfile
- Background
- Usage
- Command line interface
- Extracting Version Information
- Functional API
- Changelog
- v2.1.1 (2022-11-21)
- Fix
- v2.1.0 (2022-11-20)
- New
- v2.0.0 (2021-04-06)
- New
- как я могу использовать «pefile.py», чтобы получить версию файла (.exe)
- Ответы (2)
- Блог
- Ответ №1:
- Использование «pefile.py» для получения версии файла (.exe)
pyinstaller-versionfile
Create a windows version-file from a simple YAML file that can be used by PyInstaller.
Background
Pyinstaller provides a way to capture Windows version data through a so called version-file. The process of crafting such a version file, and especially keeping the version number updated, is a bit cumbersome. This package aims to make the creation of such a version file easier.
The key/value pairs that be specified in the version file and their official meaning are shown the following table:
Parameter Name | Description |
---|---|
CompanyName | Name of the company that produced the file, for example, «My Imaginary Company, Inc.». |
FileDescription | Description to be presented to users. It may be displayed when the user is choosing files to install. For example, «A simple app that does simple things.». |
InternalName | Internal name of the file. If the file has no internal name, this string should be the original filename, without extension. For example, ‘Simple App». |
LegalCopyright | Copyright notices that apply to the file. This should include the full text of all notices, legal symbols, copyright dates, and so on. For example, «Copyright © 2000-2022, My Imaginary Company, Inc. All rights reserved.». |
OriginalFilename | Original name of the file, not including a path. This information enables an application to determine whether a file has been renamed by a user. For example, «SimpleApp.exe». |
ProductName | Name of the product with which the file is distributed, for example, «Simple App». |
Translation | Combinations of language and character sets supported by the application. See the documentation for the codes to use. Multiple values can be specified. |
Usage
pyinstaller-versionfile provides both a command line interface and a functional API.
Command line interface
pyinstaller-versionfile provides a command line interface to convert a simple YAML file into a version-file suitable to pass to PyInstaller via the —version-file= option.
A complete YAML configuration looks like this:
1.2.3.4 My Imaginary Company Simple App Simple App © My Imaginary Company. All rights reserved. SimpleApp.exe Simple App - 0 1200 - 1033 1252
The encoding must be UTF-8. All fields are optional, you can choose to specify only those that are of interest to you.
To create version-file from this, simple run:
create-version-file metadata.yml --outfile file_version_info.txt
where metadata.yml is the YAML configuration file from above.
Extracting Version Information
As an alternative to specifying the version directly in the YAML file, there are two alternatives which may be more suitable, depending on the use case:
Link to an External File
Instead of writing the version string directly into the YAML file, you can also specify the (relative) path to another file. Note that this file must only contain the version string and nothing else.
VERSION.txt My Imaginary Company Simple App Simple App © My Imaginary Company. All rights reserved. SimpleApp.exe Simple App
Setting the Version from the Command Line
It is also possible to set the version directly over the command line using the —version option:
create-version-file metadata.yml --outfile file_version_info.txt --version 0.8.1.5
This can be useful if you want to use a CI build number as the version.
Functional API
You can also use pyinstaller-versionfile from your own python code by directly calling the functional API.
It is not necessary to use a file as input, you can also directly specify the desired values. All of them are optional and will be filled with placeholder values if not specified.
If you think you found a bug, or have a proposal for an enhancement, do not hesitate to create a new issue or submit a pull request. I will look into it as soon as possible.
Changelog
v2.1.1 (2022-11-21)
Fix
v2.1.0 (2022-11-20)
New
- Add support for Translation field to specify supported languages and charsets. [DudeNr33]
- Added a table with the official definition of the parameters in the Readme. [mkhoshbin1]
v2.0.0 (2021-04-06)
New
как я могу использовать «pefile.py», чтобы получить версию файла (.exe)
Я хочу использовать python для получения версии исполняемого файла, и я знаю pefile.py как использовать его для этого? примечания: исполняемый файл может быть не полностью.
Добро пожаловать в stackoverflow.com. Этот вопрос теперь стал обманом stackoverflow.com/questions/1264472/ — person innaM   schedule 12.08.2009
Возможный дубликат с использованием pefile.py для получения файла (.exe ) версия — person Jongware   schedule 13.01.2019
Ответы (2)
import pefile pe = pefile.PE("/path/to/something.exe") print hex(pe.VS_VERSIONINFO.Length) print hex(pe.VS_VERSIONINFO.Type) print hex(pe.VS_VERSIONINFO.ValueLength) print hex(pe.VS_FIXEDFILEINFO.Signature) print hex(pe.VS_FIXEDFILEINFO.FileFlags) print hex(pe.VS_FIXEDFILEINFO.FileOS) for fileinfo in pe.FileInfo: if fileinfo.Key == 'StringFileInfo': for st in fileinfo.StringTable: for entry in st.entries.items(): print '%s: %s' % (entry[0], entry[1]) if fileinfo.Key == 'VarFileInfo': for var in fileinfo.Var: print '%s: %s' % var.entry.items()[0]
Я безуспешно пробовал это на двоичном файле NSIS-Installer ( fileinfo.StringTable не был определен). Я нашел решение, используя атрибуты pe.VS_FIXEDFILEINFO.ProductVersionMS , pe.VS_FIXEDFILEINFO.ProductVersionLS . — person derflocki; 18.04.2013
Обратите внимание, что VS_FIXEDFILEINFO теперь представляет собой список, поэтому вам нужно использовать, например, pe.VS_FIXEDFILEINFO[0].ProductVersionMS. Также см. ответы на исходный вопрос stackoverflow.com/questions/1264472/ для примечаний по улучшению скорости. — person Erik Knowles; 18.02.2020
Я не уверен, что правильно понимаю вашу проблему, но если это что-то вроде использования pefile для получения версии предоставленного исполняемого файла, то, возможно, (взято из [учебника] [1])
import pefile pe = pefile.PE("/path/to/pefile.exe") print pe.dump_info()
предоставит вам информацию о версии. Я понятия не имею, насколько удобен pefile при анализе неполных файлов, но если предположить, что информация о версии находится где-то в заголовке, и что pefile использует генератор для чтения файла, тогда должна быть возможность прочитать информацию, если заголовок можно разобрать.
Блог
Мне было интересно, есть ли простой способ получить полную версию файла exe на python (например, если вы щелкните правой кнопкой мыши на свойствах файла и перейдете к деталям, вы найдете что-то вроде версии файла 1.1.1.0).
Я нашел что-то близкое , используя win32api.GetFileVersionInfo , однако, при перечислении свойств файла под FileVersionLS ним, похоже, указана только одна цифра, крайняя правая цифра версии файла (поэтому в приведенном выше примере он дал 0 в 1.1.1.0), когда мне нужен был полный номер версии.
Надеюсь, это имеет смысл, пожалуйста, дайте мне знать, если мне нужно что-то уточнить.
Ответ №1:
FileVersionLS и FileVersionMS действуйте вместе, чтобы представить полный номер версии в виде 64-разрядного целого числа:
dwFileVersionMS
Тип: DWORD
Наиболее значимые 32 бита двоичного номера версии файла. Этот элемент используется в dwFileVersionLS для формирования 64-разрядного значения, используемого для числовых сравнений.
dwFileVersionLS
Тип: DWORD
Наименее значимые 32 бита двоичного номера версии файла. Этот элемент используется с dwFileVersionMS для формирования 64-разрядного значения, используемого для числовых сравнений.
Каждый из них битно упакован двумя 16-битными числами, поэтому вам нужно немного изменить отдельные числа. Вы можете использовать win32api.LOWORD() и win32api.HIWORD() для этого, например:
def get_file_version(self, path): info = win32api.GetFileVersionInfo(path, '\') ms = info['FileVersionMS'] ls = info['FileVersionLS'] return (win32api.HIWORD(ms), win32api.LOWORD(ms), win32api.HIWORD(ls), win32api.LOWORD(ls))
Использование «pefile.py» для получения версии файла (.exe)
Вот полный пример скрипта, который делает то, что вы хотите:
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 \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)
все это происходит только после проверки, что у нас есть что-то значимое в этих свойствах.
Предполагая, что под «версией исполняемого файла» вы подразумеваете 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.