从Python程序获取WinWord版本

从Python程序获取WinWord版本,python,windows,Python,Windows,在一个用于测试用户环境的简单Python程序中,我还应该获得已安装Word的版本(例如:WinWord 16,64位)。 你知道怎么做吗?我确信,应该存在不同的guid,但是在哪里可以找到它们:-) ****编辑 我检查了两个建议,但这还不够。如果Word是32位或64位,我必须获取信息。到目前为止,我已经检查了“winword.exe”的位置。例如:1。64位Office 15 c:\program files\microsoft Office\office15\winword.exe 2的位

在一个用于测试用户环境的简单Python程序中,我还应该获得已安装Word的版本(例如:WinWord 16,64位)。 你知道怎么做吗?我确信,应该存在不同的guid,但是在哪里可以找到它们:-)

****编辑

我检查了两个建议,但这还不够。如果Word是32位或64位,我必须获取信息。到目前为止,我已经检查了“winword.exe”的位置。例如:1。64位Office 15 c:\program files\microsoft Office\office15\winword.exe 2的位置。32位Office 15 c:\program files(x86)\microsoft Office\office15\winword.exe的位置

我确信m$有最新版本Word的GUI列表(在注册表中使用)。但我找不到列表:-)使用建议的解决方案,我无法检查32位或64位技术。

使用架构检测(32位或64位)搜索shorcuts 我认为额外的信息会很有用,但您可以将其减少到32位和64位

import subprocess, os, struct

def getWordVersion():
    directory = "C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs"
    wordFile = ""
    wordVersion = ""

    def recursiveSearch(directory):
        for root, dirs, filenames in os.walk(directory):
            for dire in dirs:
                result = recursiveSearch(root + "\\" + dire)
                if result:
                    return result
            for filename in filenames:
                if filename.endswith(".lnk") and filename.startswith("Word "):
                    wordFile = root + "\\" + filename
                    wordVersion = filename[:-4]
                    return wordFile, wordVersion
        return False

    wordFile, wordVersion = recursiveSearch(directory)

    lnkTarget = subprocess.check_output(["C:\\WINDOWS\\system32\\WindowsPowerShell\\v1.0\\powershell.exe",
                      "(New-Object -ComObject WScript.Shell).CreateShortcut('" + wordFile + "').TargetPath"],shell=True)
    locationOfLnk = lnkTarget.strip()

    IMAGE_FILE_MACHINE_I386=332
    IMAGE_FILE_MACHINE_IA64=512
    IMAGE_FILE_MACHINE_AMD64=34404
    f=open(locationOfLnk, "rb")

    f.seek(60)
    s=f.read(4)
    header_offset=struct.unpack("<L", s)[0]
    f.seek(header_offset+4)
    s=f.read(2)
    machine=struct.unpack("<H", s)[0]
    architecture = ""

    if machine==IMAGE_FILE_MACHINE_I386:
        architecture = "IA-32 (32-bit x86)"
    elif machine==IMAGE_FILE_MACHINE_IA64:
        architecture = "IA-64 (Itanium)"
    elif machine==IMAGE_FILE_MACHINE_AMD64:
        architecture = "AMD64 (64-bit x86)"
    else:
        architecture = "Unknown architecture"

    f.close()
    return wordVersion + " "  + architecture

print(getWordVersion())

另一种方法是使用OLE/ActiveX/COM技术。这是提供的“注册表方法”的某种高级版本。 假设您在Windows计算机上,因为在大多数情况下,这在Linux上不起作用:

#!/usr/bin/env python3
from win32com.client.dynamic import Dispatch

word = Dispatch('Word.Application')
print (word)
word_version = word.version
print (word_version)
  • 创建虚拟环境:
    $python-m venv ve
  • 激活virtualenv:
    $ve\Scripts\Activate.bat
  • 安装pypiwin32:
    (ve)$pip安装pypiwin32
  • 执行:
    (ve)$python detect\u msword\u version.py
  • 在我的Windows计算机上,输出为:

    Microsoft Word


    16.0

    Tnx,我会检查。程序快捷方式依赖于标准快捷方式的位置和名称,用户可以更改这些位置和名称。注册表方法是相当低级的(imho)是的,我同意。但是,一般来说,人们不会修改通过将Word安装到为“开始”菜单快捷方式预先指定的文件夹中而创建的快捷方式。老实说,这有点像说“用户可能已经更改了注册表项”。他们可以吗?对他们会吗?可能不会。我试图让你的工作,但我在
    win32com
    上运气不好。所以,我将保留我的解决方案。Tnx,我会检查。只是想确保您看到我的更新版本。它检测架构以及版本。Tnx“nfn neil”。。。但它更为复杂。我有很多电脑都有64位操作系统,但都有32位Office。就我而言,所有信息(Word版本)都很重要。这正是它的作用,如果您找到更好的方法,请告诉我。对不起,我没有仔细检查您的代码。现在我明白了。但在我尝试之后,我发现许多计算机不使用相同的文件夹作为开始快捷方式(例如,子文件夹中可能有Word的快捷方式)。但除此之外,它应该会起作用。我当前的解决方案是检查标准winword.exe文件夹的列表。从位置可以看到Office是32位还是64位。我知道这也不是一个完美的解决方案,但它现在起作用了。但说实话,我喜欢你的解决方案。因为我是一个PythonNoob——我应该在for循环中更改什么来检查所有子文件夹并在那里找到快捷方式?
    #!/usr/bin/env python3
    from win32com.client.dynamic import Dispatch
    
    word = Dispatch('Word.Application')
    print (word)
    word_version = word.version
    print (word_version)