Не могу импортировать comtypes.gen

У меня установлены comtypes 0.6.2 на Python 2.6. Если я попробую это:

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 не работает. Этот символ должен быть частью сгенерированного кода. Итак, как мне сгенерировать этот код?


person Frederick The Fool    schedule 10.10.2010    source источник


Ответы (3)


Что ж, после некоторых экспериментов у меня есть решение.

Я обнаружил, что:

  1. Импорт comtypes.client автоматически создает подпакет comtypes.gen.
  2. Вызов 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-библиотеку, теперь я могу без проблем получить доступ к IWshRuntimeLibrary.

person Frederick The Fool    schedule 10.10.2010

Возможно, как говорится, пакета package gen в comptypes не существует. Проверьте папку с пакетами сайтов (C:\Python26\Lib\site-packages в Windows, замените C:\Python26 каталогом установки) на наличие вложенной папки comtypes\gen.

person Peter C    schedule 10.10.2010
comment
Подпапка gen, включая соответствующую __init__.py, существует в моих сайтах-пакетах. Итак, поскольку я могу импортировать comtypes, я должен иметь возможность импортировать и этот конкретный подпакет. - person Frederick The Fool; 10.10.2010
comment
Обновление: я только что сделал reload(comtypes.gen), и чудесным образом это сработало. Теперь следующая проблема: я пытаюсь импортировать символ, используя from comtypes.gen import IWshRuntimeLibrary. Я должен быть в состоянии сделать это (потому что эта строка из кода редактора DreamPie). Но это не удается. Но это ожидаемо, потому что __init__.py, упомянутый выше, совершенно пуст, а комментарии внутри него что-то говорят о сгенерированном коде. Итак, мой вопрос: как мне сгенерировать код (из-за отсутствия лучшей формулировки)? - person Frederick The Fool; 10.10.2010
comment
Ну это необычно. Возможно, в init.py есть синтаксическая ошибка? РЕДАКТИРОВАТЬ: О. Может быть, где-то есть скрипт для генерации кода? И должен ли код генерироваться автоматически во время выполнения? Кстати, кроме init.py в папке gen есть другие файлы? - person Peter C; 10.10.2010
comment
Нет, это просто __init__.py и его скомпилированная версия. Позвольте мне просмотреть папку установки comtypes на наличие скриптов. - person Frederick The Fool; 10.10.2010
comment
Я нашел codegenerator.py, но я действительно не уверен, как заставить его работать. В идеале можно было бы ожидать, что он должен запускаться автоматически во время установки или что-то в этом роде. В любом случае, теперь это потребует некоторой доработки. Спасибо, alpha123, за то, что подтолкнули меня в правильном (хотя это и должно было быть очевидным) направлении. - person Frederick The Fool; 10.10.2010
comment
Без проблем. Глядя на свой собственный ответ ниже, рад видеть, что у вас все получилось. - person Peter C; 11.10.2010

Недавно я получил новый офис, и мне пришлось расширить скрипт @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)
person Mandragor    schedule 11.01.2019