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