2010-02-16 7 views
1

Fondamentalement, j'essaie de trouver quelle version d'ArcGIS l'utilisateur a actuellement installé, j'ai regardé à travers le registre et ne pouvais pas trouver quelque chose lié à une chaîne de version. Cependant je sais qu'il est stocké, dans le .exe.Vous recherchez la version d'une application à partir de Python?

J'ai fait un peu de googling, et ne trouve rien qui vaille vraiment la peine. J'ai essayé d'utiliser GetFileVersionInfo, et j'ai l'impression d'obtenir un mélange aléatoire de choses.

Des idées?

EDIT

Soupir ....

Turns out pywin32 est pas toujours installé sur toutes les machines. Est-ce que quelqu'un sait s'il est possible de faire la même chose par le biais de ctypes?

Aussi seulement pour Windows.

Répondre

2

Si vous préférez ne pas faire cela en utilisant pywin32, vous seriez en mesure de le faire avec ctypes, à coup sûr.

L'astuce sera de décoder cette structure de version de fichier stupide qui revient. Il y a un old mailing list post qui fait ce que vous demandez. Malheureusement, je ne dispose pas d'une boîte Windows pour le tester moi-même, maintenant. Mais si ça ne marche pas, ça devrait au moins vous donner un bon départ.

est ici le code, dans le cas où ces archives 2006 disparaissent quelque temps:

import array 
from ctypes import * 

def get_file_info(filename, info): 
    """ 
    Extract information from a file. 
    """ 
    # Get size needed for buffer (0 if no info) 
    size = windll.version.GetFileVersionInfoSizeA(filename, None) 
    # If no info in file -> empty string 
    if not size: 
     return '' 
    # Create buffer 
    res = create_string_buffer(size) 
    # Load file informations into buffer res 
    windll.version.GetFileVersionInfoA(filename, None, size, res) 
    r = c_uint() 
    l = c_uint() 
    # Look for codepages 
    windll.version.VerQueryValueA(res, '\\VarFileInfo\\Translation', 
            byref(r), byref(l)) 
    # If no codepage -> empty string 
    if not l.value: 
     return '' 
    # Take the first codepage (what else ?) 
    codepages = array.array('H', string_at(r.value, l.value)) 
    codepage = tuple(codepages[:2].tolist()) 
    # Extract information 
    windll.version.VerQueryValueA(res, ('\\StringFileInfo\\%04x%04x\\' 
+ info) % codepage, byref(r), byref(l)) 
    return string_at(r.value, l.value) 

print get_file_info(r'C:\WINDOWS\system32\calc.exe', 'FileVersion') 

-

Ok - Retour à proximité d'une boîte de fenêtres. J'ai déjà essayé ce code maintenant. "Travaille pour moi".

>>> print get_file_info(r'C:\WINDOWS\system32\calc.exe', 'FileVersion') 
6.1.7600.16385 (win7_rtm.090713-1255) 
0

il y a un utilitaire linux gnu appelé « chaînes » qui affiche les caractères imprimables dans un fichier (binaire ou non binaire), essayez de l'utiliser et de rechercher un numéro de version comme modèle

sur les fenêtres, vous pouvez obtenir chaînes ici http://unxutils.sourceforge.net/

Questions connexes