无法导入comtypes.gen

时间:2010-10-10 01:50:53

标签: python import comtypes

我在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 comtypesimport comtypes.client等其他导入工作正常。

我做错了什么?

从名称看comtypes.gen生成的代码是什么?如果是这样,在导入之前是否需要某些准备步骤?我以管理员身份登录。这会导致代码生成失败吗?

修改reload(comtypes.gen)解决了上述问题(虽然我不明白)。但是,现在from comtypes.gen import IWshRuntimeLibrary无效。此符号应该是生成的代码的一部分。那么如何生成此代码呢?

3 个答案:

答案 0 :(得分:4)

嗯,经过一些实验,我得到了解决方案。

我发现:

  1. 导入comtypes.client会自动创建comtypes.gen子包。
  2. 致电comtypes.client.GetModule("MyComLib")会为"MyComLib"生成包装。
  3. 以下代码为我完成了这项工作:

    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)