À quoi ressemble un "fichier de version"?
J'ai googlé cela pendant des siècles maintenant sans résultats. Le manuelPyInstaller indique:
--version-file=FILE add a version resource from FILE to the exe
Ça a l'air sympa. Je veux mettre des informations de version dans Mes exécutables. Le problème est que je n'ai aucune idée de ce à quoi ressemble un "fichier de version" et je ne peux pas trouver un seul exemple de celui que je peux utiliser. Je considérerais un exemple de fichier de version comme une réponse acceptable à cette question.
Ce que j'ai essayé
, Le manuel dit aussi:
Version
Famille Windows NT uniquement. version = ' myversion.txt". Utiliser GrabVersion.py pour voler une ressource de version d'un exécutable, et ensuite, modifiez la sortie pour créer la vôtre. (La syntaxe de la version resources est si mystérieux que je n'essaierais pas d'en écrire un zéro.)
J'ai essayé cela avec d'innombrables fichiers exécutables de mon système maintenant. Je continue juste à obtenir ces erreurs:
Traceback (most recent call last): File "C:pyinstaller-2.0utilsGrabVersion.py", line 42, in vs = versioninfo.decode(sys.argv[1]) File "C:pyinstaller-2.0PyInstallerutilsversioninfo.py", line 33, in decode nm = win32api.EnumResourceNames(h, RT_VERSION)[0] IndexError: list index out of range
Sur les exécutables qui n'ont pas d'informations de version, et:
Traceback (most recent call last): File "C:pyinstaller-2.0utilsGrabVersion.py", line 43, in print vs File "C:pyinstaller-2.0PyInstallerutilsversioninfo.py", line 147, in __repr__ % (indent, self.ffi.__repr__(indent), indent, File "C:pyinstaller-2.0PyInstallerutilsversioninfo.py", line 251, in __repr__ "filevers=%s," % fv, TypeError: not all arguments converted during string formatting
Sur le reste.
5 réponses
Je viens de jeter un coup d'œil aux sources. Il semble que le fichier de version devrait être la source Python elle-même en tant que fichier de version fourni avec être lu, puis eval
'ed.
Le script GrabVersion.py
semble générer des erreurs comme vous l'avez déjà trouvé, j'ai donc modifié la fonction __repr__
de FixedFileInfo
pour convertir manuellement les arguments tuple en chaînes.
Windows cmd.exe
a une ressource de version Windows intégrée, voici la sortie de GrabVersion.py
que vous enregistrez dans un fichier et que vous alimentez PyInstaller.
VSVersionInfo(
ffi=FixedFileInfo(
filevers=(6, 1, 7601, 17514),
prodvers=(6, 1, 7601, 17514),
mask=0x3f,
flags=0x0,
OS=0x40004,
fileType=0x1,
subtype=0x0,
date=(0, 0)
),
kids=[
StringFileInfo(
[
StringTable(
u'040904B0',
[StringStruct(u'CompanyName', u'Microsoft Corporation'),
StringStruct(u'FileDescription', u'Windows Command Processor'),
StringStruct(u'FileVersion', u'6.1.7601.17514 (win7sp1_rtm.101119-1850)'),
StringStruct(u'InternalName', u'cmd'),
StringStruct(u'LegalCopyright', u'\xa9 Microsoft Corporation. All rights reserved.'),
StringStruct(u'OriginalFilename', u'Cmd.Exe'),
StringStruct(u'ProductName', u'Microsoft\xae Windows\xae Operating System'),
StringStruct(u'ProductVersion', u'6.1.7601.17514')])
]),
VarFileInfo([VarStruct(u'Translation', [1033, 1200])])
]
)
Je n'ai pas essayé de définir une ressource de version avec PyInstaller donc je ne suis pas sûr que cela fonctionnera, je serais intéressé par vos commentaires.
Je pourrais manquer cela dans les réponses précédentes, ou peut-être que PyInstaller a été mis à jour depuis que ces réponses ont été fournies à l'origine, mais les documents actuels pour PyInstaller enseignent une méthode assez simple pour cela en utilisant un outil de ligne de commande fourni avec PyInstaller (bien que j'ai manqué cette section les
Pointez cet outil sur un .fichier exe sur votre système qui a des informations de version" beau", et il va créer un lisible par l'homme, commenté, fichier de ressources de version modifiable que vous pouvez utiliser comme point de départ.
pyi-grab_version executable_with_version_resource
Qui écrit par défaut un fichier file_version_info.txt
dans le répertoire de travail.
Exécuter ce qui précède sur ma copie locale de svn.exe produit:
# UTF-8
#
# For more details about fixed file info 'ffi' see:
# http://msdn.microsoft.com/en-us/library/ms646997.aspx
VSVersionInfo(
ffi=FixedFileInfo(
# filevers and prodvers should be always a tuple with four items: (1, 2, 3, 4)
# Set not needed items to zero 0.
filevers=(1, 9, 7, 30920),
prodvers=(1, 9, 7, 30920),
# Contains a bitmask that specifies the valid bits 'flags'r
mask=0x3f,
# Contains a bitmask that specifies the Boolean attributes of the file.
flags=0x0,
# The operating system for which this file was designed.
# 0x4 - NT and there is no need to change it.
OS=0x4,
# The general type of file.
# 0x1 - the file is an application.
fileType=0x1,
# The function of the file.
# 0x0 - the function is not defined for this fileType
subtype=0x0,
# Creation date and time stamp.
date=(0, 0)
),
kids=[
StringFileInfo(
[
StringTable(
u'040904B0',
[StringStruct(u'CompanyName', u'Apache Software Foundation'),
StringStruct(u'FileDescription', u'svn'),
StringStruct(u'FileVersion', u'1.9.7'),
StringStruct(u'InternalName', u'SVN'),
StringStruct(u'LegalCopyright', u'Copyright (c) The Apache Software Foundation'),
StringStruct(u'OriginalFilename', u'svn.exe'),
StringStruct(u'ProductName', u'Subversion'),
StringStruct(u'ProductVersion', u'1.9.7 (r1800392)')])
]),
VarFileInfo([VarStruct(u'Translation', [1033, 1200])])
]
)
Modifiez ceci à votre intention, et renvoyez-le à PyInstaller en tant que --version-file
, par exemple
pyinstaller [options] myscript.py --version-file file_version_info.txt
Créez votre fichier de Version en utilisant une réponse antérieure enregistrez-le sous version.rc
Localisez le fichier filename.spec
Ouvrez-le.
ensuite, dans ce script, localisez le:
exe = EXE(pyz,...)
À la fin de cette section entière, ajoutez ce morceau de code pour intégrer automatiquement les informations de version dans votre fichier exe
version='version.rc'
Enregistrez-le, puis lancez à nouveau pyinstaller et cette fois exécutez le programme d'installation en utilisant ce code:
pyinstaller filename.spec
Cela créera non seulement le fichier exe lui-même, mais inclura également toute votre version des informations aussi.
Dans le cas où vous n'y auriez pas pensé, remplacez le filename
par le nom de fichier de votre programme
J'ai eu des problèmes avec Pyinstaller--Version-file option en Python 3 et je le résous en utilisant Outil de Ressource de Version Simple .
Avec cet outil, vous pouvez afficher le contenu de n'importe quelle ressource de version , utilisez simplement l'option / vo avec n'importe quel fichier exécutable: verpatch.exe /vo c:\Windows\System32\cmd.exe
Pour ajouter un nouveau la version de la ressource à un fichier exécutable, il suffit de suivre cet exemple:
verpatch.exe script.exe 1.0.0.0 /va /pv 1.0.0.0 /s description "Your product description" /s product "Your product name" /s copyright "Your company name, 2016" /s company "Your company name"
Veuillez noter que le fichier de version est un code Python, vous pouvez donc lui donner l'extension .py
pour le voir bien formaté dans votre IDE, pour vérifier les erreurs (ignorer les références non résolues, bien sûr), et pour faire tout ce que Python vous permet de faire.