我在Python 2.6上安装了comtypes 0.6.2。如果我试试这个:
import comtypes.gen
我明白了:
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
import comtypes.gen
ImportError: No module named gen
然而,import comtypes
和import comtypes.client
等其他导入工作正常。
我做错了什么?
从名称看comtypes.gen
生成的代码是什么?如果是这样,在导入之前是否需要某些准备步骤?我不以管理员身份登录。这会导致代码生成失败吗?
修改
用reload(comtypes.gen)
解决了上述问题(虽然我不明白)。但是,现在from comtypes.gen import IWshRuntimeLibrary
无效。此符号应该是生成的代码的一部分。那么如何生成此代码呢?
答案 0 :(得分:4)
嗯,经过一些实验,我得到了解决方案。
我发现:
comtypes.client
会自动创建comtypes.gen
子包。comtypes.client.GetModule("MyComLib")
会为"MyComLib"
生成包装。以下代码为我完成了这项工作:
import os
import glob
import comtypes.client
#Generates wrapper for a given library
def wrap(com_lib):
try:
comtypes.client.GetModule(com_lib)
except:
print "Failed to wrap {0}".format(com_lib)
sys32dir = os.path.join(os.environ["SystemRoot"], "system32")
#Generate wrappers for all ocx's in system32
for lib in glob.glob(os.path.join(sys32dir, "*.ocx")):
wrap(lib)
#Generate for all dll's in system32
for lib in glob.glob(os.path.join(sys32dir, "*.tlb")):
wrap(lib)
将相关的COM lib包装好后,现在我可以正常访问IWshRuntimeLibrary。
答案 1 :(得分:1)
或许,正如它所说,comptypes中的包gen包不存在。检查您的site-packages文件夹(Windows上的C:\ Python26 \ Lib \ site-packages,将C:\ Python26替换为您的安装目录),以获取comtypes \ gen子文件夹。
答案 2 :(得分:0)
最近我有了新的办公室,我不得不扩展@frederick的脚本来再次生成所有办公室对象。
import os
import glob
import comtypes.client
# You may want to change the office path
msoffice=r'C:\Program Files (x86)\Microsoft Office\root\Office16'
#Generates wrapper for a given library
def wrap(com_lib):
try:
comtypes.client.GetModule(com_lib)
except:
print("Failed to wrap {0}".format( com_lib))
sys32dir = os.path.join(os.environ["SystemRoot"], "system32")
#Generate wrappers for all ocx's in system32
for lib in glob.glob(os.path.join(sys32dir, "*.ocx")):
wrap(lib)
#Generate for all dll's in system32
for lib in glob.glob(os.path.join(msoffice, "*.tlb")):
wrap(lib)
for lib in glob.glob(os.path.join(msoffice, "*.olb")):
wrap(lib)
# And a special case for Excel
excel=os.path.join(msoffice,"excel.exe")
wrap(excel)