Imprimer les infos de version de l'executable avec py2exe

J’ai eu récemment besoin d’afficher le numéro de version d’une application python transformée en exécutable avec py2exe pour pouvoir vérifier rapidement quelle est la version de l’exécutable utilisée.

Voici du code que j’ai trouvé ici : http://www.thescripts.com/forum/thread29263.html

Il utilise la bibliothèque win32api qui permet d’appeler des fonctions de l’API Windows. La documentation de la classe FileVersionInfo se trouve ici La documentation de la structure VS_FIXEDFILEINFO se trouve ici

Le code original (voir plus bas pour mon code simplifié)

def print_version() :
    import os, win32api, sys
    # les métadonnées de version sont des associations clé/valeur
    # les chaînes suivantes sont normalisées et peuvent être trouvées dans le lien donné ci-dessus
    ver_strings=('Comments', 'InternalName', 'ProductName', 'CompanyName', 'LegalCopyright', 'ProductVersion', 'FileDescription', 'LegalTrademarks', 'PrivateBuild', 'FileVersion', 'OriginalFilename', 'SpecialBuild')
    fname = sys.executable
    d=win32api.GetFileVersionInfo(fname, '\\')
    ## si on passe \ (backslash) à GetFileVersionInfo(), elle renvoie un dictionnaire au format VS_FIXEDFILEINFO (voir ci-dessus)
    for n, v in d.items():
        print n, v
    pairs=win32api.GetFileVersionInfo(fname, '\\VarFileInfo\\Translation')
    print "%s: %d.%d.%d.%d" % (fname,d['FileVersionMS'] / (256*256), d['FileVersionMS'] % (256*256), d['FileVersionLS'] / (256*256), d['FileVersionLS'] % (256*256))
    ## \VarFileInfo\Translation renvoie une liste de tuples (langue, codepage) qui peuvent être utilisées pour récupérer des infos textuelles
    ## ensuite on peut récupérer les infos traduits via \StringfileInfo\%04X%04X\parm_name, où les 2 infos du milieu sont la langue et le code page retournés dans la précédente liste
    for lang, codepage in pairs:
        print 'lang: ', lang, 'codepage:', codepage
    for ver_string in ver_strings:
        str_info=u'\\StringFileInfo\\%04X%04X\\%s' %(lang,codepage,ver_string)
    ## print str_info
    print ver_string, win32api.GetFileVersionInfo(fname, str_info)

Version simplifiée

def print_version() :
     import sys, os
     # info de version disponible dans l'exe uniquement si passage par py2exe
     # qui place l'attribut "frozen" dans sys
     basename = os.path.basename(sys.argv[0])
     version = "*** %s (pas d'info de version) ***\n" % (basename)
     if hasattr(sys, "frozen") :
         import win32api
         fname = sys.executable
         d=win32api.GetFileVersionInfo(fname, '\\')
         version = "*** %s version %d.%d.%d.%d ***\n" % (basename,d['FileVersionMS'] / (256*256), d['FileVersionMS'] % (256*256), d['FileVersionLS'] / (256*256), d['FileVersionLS'] % (256*256))
     print version 
comments powered by Disqus