web-dev-qa-db-fra.com

A quoi ressemble un "fichier de version"?

Cela fait des loups que je cherche sur Google depuis des siècles. Le manuel PyInstaller dit:

 - version-file = FILE 
 ajoute une ressource de version de FILE à l'exe 

Ça me semble bien. 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 que je ne trouve pas un seul exemple que je puisse 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'. Utilisez GrabVersion.py pour voler une ressource de version d’un exécutable, puis modifiez la sortie pour créer la vôtre. (La syntaxe des ressources de version est tellement obscure que je ne voudrais pas en écrire une de toutes pièces.)

J'ai essayé cela avec d'innombrables fichiers exécutables de mon système maintenant. Je continue juste à avoir ces erreurs:

Traceback (appel le plus récent en dernier): 
 Fichier "C:\pyinstaller-2.0\utils\GrabVersion.py", ligne 42, dans 
 Vs = versioninfo.decode (sys.argv [1] ) 
 Fichier "C:\pyinstaller-2.0\PyInstaller\utils\versioninfo.py", ligne 33, en décodage 
 Nm = win32api.EnumResourceNames (h, RT_VERSION) [0] 
 IndexError: index de liste hors limites

sur les exécutables sans information de version, et:

Traceback (appel le plus récent en dernier): 
 Fichier "C:\pyinstaller-2.0\utils\GrabVersion.py", ligne 43, dans 
 Print vs 
 Fichier "C:\pyinstaller-2.0\PyInstaller\utils\versioninfo.py ", ligne 147, dans __repr __ 
% (indent, self.ffi .__ repr __ (indent), indent, 
 Fichier" C:\pyinstaller- 2.0\PyInstaller\utils\versioninfo.py ", ligne 251, dans __repr __ 
" Filevers =% s, "% fv, 
 TypeError: tous les arguments ne sont pas convertis lors du formatage de chaîne.

Sur le reste.

22
Hubro

Je viens juste de jeter un coup d’œil aux sources. Il semble que le fichier de version soit censé être la source Python elle-même, car le fichier de version fourni doit être lu, puis eval 'ed.

Le script GrabVersion.py semble générer des erreurs comme vous l'avez déjà constaté. J'ai donc modifié la fonction __repr__ de FixedFileInfo afin de convertir manuellement les arguments Tuple en chaînes.

Le cmd.exe de Windows a une ressource de version Windows intégrée, voici le résultat de GrabVersion.py que vous voudriez enregistrer dans un fichier et alimenter 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, je ne suis donc pas sûr que cela fonctionne. J'aimerais connaître vos commentaires.

24
Austin Phillips

Peut-être que cela manque 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 la documentation actuelle de PyInstaller enseigne un méthode assez simple pour cela en utilisant un outil de ligne de commande fourni avec PyInstaller (bien que j'ai raté cette section les premières fois où j'ai jeté un œil à la documentation).

Pointez cet outil sur un fichier .exe de votre système contenant des informations de version "esthétiques" et créera un fichier de ressource de version éditable, commentée et commentée, que vous pourrez 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.

L'exécution de 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])])
  ]
)

éditez-le selon vos besoins et transmettez-le à PyInstaller en tant que --version-file, par exemple.

pyinstaller [options] myscript.py --version-file file_version_info.txt
3
mac

Créez votre fichier de version en utilisant une réponse précédente, enregistrez-le sous version.rc

Localisez le fichier filename.spec et ouvrez-le. Ensuite dans ce script, localisez le:

exe = EXE(pyz,...)

à la fin de cette section, ajoutez ce morceau de code pour incorporer automatiquement les informations de version sur votre fichier exe

version='version.rc'

Enregistrez-le, puis lancez à nouveau pyinstaller et exécutez cette fois le programme d'installation à l'aide du code suivant:

pyinstaller filename.spec 

cela créera non seulement le fichier exe lui-même, mais inclura également toutes vos informations de version.

Si vous n'y avez pas pensé, remplacez la filename par le nom de fichier de votre programme

3
vampnerdlord

J'ai eu des problèmes avec l'option Pyinstaller --version-file dans Python 3 et je l'ai résolu avec Outil de ressource de version simple .

Avec cet outil, vous pouvez afficher le contenu de n’importe quelle ressource version, utilisez simplement l’option/vo avec n’importe quel fichier exécutable: verpatch.exe /vo c:\Windows\System32\cmd.exe

Pour ajouter une ressource new version à un fichier exécutable, suivez simplement 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"

2
J. Mulet

Veuillez noter que le fichier de version est un code Python. Vous pouvez donc lui attribuer l'extension .py pour le voir bien formaté dans votre IDE, pour rechercher les erreurs éventuelles (ignorer les références non résolues) et pour faire tout ce que Python vous permet de faire. .

0
tivnet