Can't import comtypes.gen

2019-05-03 19:52发布

问题:

I have comtypes 0.6.2 installed on Python 2.6. If I try this:

import comtypes.gen

I get:

Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    import comtypes.gen
ImportError: No module named gen

Other imports like import comtypes and import comtypes.client, however, work fine.

What am I doing wrong?

From the name it seems comtypes.gen is generated code? If so, do I need certain preparatory steps before importing? I'm not logged in as administrator. Could that cause code generation to fail?

Edit: The above problem is solved with a reload(comtypes.gen) (I don't understand how, though). However, now from comtypes.gen import IWshRuntimeLibrary is not working. This symbol should be part of a generated code. So how do I get this code to be generated?

回答1:

Well, after some experimentation, I have the solution.

I've found that:

  1. Importing comtypes.client automatically creates the comtypes.gen subpackage.
  2. Calling comtypes.client.GetModule("MyComLib") generates a wrapper for "MyComLib".

So the following code did the job for me:

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) 

Having the relevant COM lib wrapped, now I can access IWshRuntimeLibrary just fine.



回答2:

Perhaps, as it says, the package gen package in comptypes doesn't exist. Check your site-packages folder (C:\Python26\Lib\site-packages on Windows, substitute the C:\Python26 with your installation directory) for a comtypes\gen subfolder.



回答3:

recently i got the new office, and i had to extend the script of @frederick to generate all the office objects again.

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)