【问题标题】:Get WinWord version from Python program从 Python 程序获取 WinWord 版本
【发布时间】:2018-04-27 00:16:00
【问题描述】:

在一个用于测试用户环境的简单 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 的 GUID 列表(在注册表中使用)。但我找不到列表 :-) 使用建议的解决方案,我无法检查 32- 或 64- 技术。

【问题讨论】:

  • 只是想确保您看到我的更新版本。它会检测架构以及版本。
  • Tnx "nfn neil" ...但它更复杂。我有许多计算机使用 64 位操作系统,但使用 32 位 Office。就我而言,所有信息(Word 版本)都很重要。
  • 这正是它的作用,如果你找到更好的方法,请告诉我。
  • 对不起,我没有仔细检查你的代码。现在我明白了。但是在我尝试之后,我发现很多计算机并没有使用同一个文件夹作为开始快捷方式(例如子文件夹中可以有 Word 的快捷方式)。但否则它应该工作。我当前的解决方案是检查标准 winword.exe 文件夹列表。从位置您可以查看 Office 是 32 位还是 64 位。我知道这也不是完美的解决方案,但它现在有效。
  • 但老实说,我喜欢你的解决方案。由于我是 Python 新手 - 我应该在 for 循环中更改什么以检查所有子文件夹并在那里找到快捷方式?

标签: python windows


【解决方案1】:

使用架构检测(32 位或 64 位)搜索快捷方式

我认为附加信息会很有用,但您可以将其缩减为仅 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())

注册方法

一种方法是遍历Office 下的所有注册表项并找到最新的。不幸的是,微软认为在几乎每个版本中更改安装目录是个好主意。因此,如果您想编译所有安装位置的完整列表,那将是可行的(除非他们将其安装在自定义位置)。

注意:这是 Python 3 代码,如果你需要 Python 2,则将 winreg 更改为 _winreg

import winreg

def getMicrosoftWordVersion():
    key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Office", 0, winreg.KEY_READ)
    versionNum = 0
    i = 0
    while True:
        try:
            subkey = winreg.EnumKey(key, i)
            i+=1
            if versionNum < float(subkey):
                versionNum = float(subkey)
        except: #relies on error handling WindowsError as e as well as type conversion when we run out of numbers
            break
    return versionNum


print(getMicrosoftWordVersion())

【讨论】:

  • Tnx,我会检查的。
  • 程序快捷方式依赖于标准的快捷方式位置和名称,可由用户更改。注册表方法非常低级(恕我直言)
  • 是的,我同意。但是,一般来说,人们不会将通过安装 Word 创建的快捷方式修改到为开始菜单快捷方式预先指定的文件夹中。老实说,这有点像说“用户可以更改该注册表项”。他们可以吗?是的。他们会吗?可能不是。我试图让你的工作正常,但我对win32com 运气不佳。所以,我将保留我的解决方案。
【解决方案2】:

另一种方法是使用 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)
  1. 创建虚拟环境:$ python -m venv ve
  2. 激活虚拟环境:$ ve\Scripts\activate.bat
  3. 安装pypiwin32:(ve)$ pip install pypiwin32
  4. 执行:(ve)$ python detect_msword_version.py

在我的 Windows 机器上输出是:

Microsoft Word

16.0

【讨论】:

  • Tnx,我会检查的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-29
  • 1970-01-01
  • 2015-10-26
  • 2011-03-21
  • 2018-01-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多