从Python查找应用程序的版本?

时间:2010-02-16 02:47:52

标签: python winapi

基本上我试图找出用户当前安装的ArcGIS版本,我查看了注册表,找不到任何与版本字符串相关的内容。但是我知道它存储在.exe中。

我做了一些谷歌搜索,找不到任何值得的东西。我尝试使用GetFileVersionInfo,我似乎得到了随机的混搭。

有什么想法吗?

修改

...叹息

结果证明pywin32并不总是安装在所有机器上。有谁知道它是否可以通过ctypes做同样的事情?

此外,这仅适用于Windows。

2 个答案:

答案 0 :(得分:2)

如果您不想使用pywin32这样做,您肯定可以使用ctypes执行此操作。

诀窍将是解码回来的那个愚蠢的文件版本结构。

有一个old mailing list post正在做你正在问的问题。不幸的是,我现在没有一个方便自己测试这个窗口的方框。但如果它不起作用,至少应该给你一个良好的开端。

以下是代码,以防2006年的档案在某些时候消失:

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')

-

好的 - 靠近窗户框。实际上已经尝试过此代码了。 “为我工作”。

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

答案 1 :(得分:0)

有一个名为'strings'的gnu linux实用程序可以在任何文件(二进制或非二进制)中打印可打印字符,尝试使用它并查找类似于模式的版本号

在Windows上

,您可以在此处获取字符串http://unxutils.sourceforge.net/