从Python程序获取WinWord版本
在一个用于测试用户环境的简单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位从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的位
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
$ve\Scripts\Activate.bat
(ve)$pip安装pypiwin32
(ve)$python detect\u msword\u version.py
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)