win32com.client.Dispatch + Cherrypy = CoInitialize не был вызван

Следующий код работает хорошо, но он не работает, если выполняется из метода приложения CherryPy с сообщением об ошибке CoInitialize has not been called:

import win32com.client
xl = win32com.client.Dispatch("Excel.Application")
xl.quit()

Этот пост предлагает решение, которое работает для меня:

import pythoncom
pythoncom.CoInitialize()

Причина, по которой я спрашиваю о проблеме, для которой у меня уже есть решение, заключается в том, что (1) я хотел бы знать, что я делаю (а не делать это только потому, что однажды видел, как это работает) и (2)) Я не хочу рисковать пропустить что-то важное (и чтение этого поста заставляет меня думать, что я что-то упускаю.)

Я не мог найти документацию для pythoncom.CoInitialize()и источником pythoncom являются следующие три строки, которые мне не помогают (ни Eclipse+pydev, который говорит, что метод не существует):

# Magic utility that "redirects" to pythoncomxx.dll
import pywintypes
pywintypes.__import_pywin32_system_module__("pythoncom", globals())

1 ответ

Решение

Я точно не помню, как я не работал с COM в последние годы, но я думаю, что вам нужно инициализировать COM в каждом потоке, с которым вы работаете (опять же, я не уверен в каждом отсеке COM). Поскольку CherryPy - это многопоточные серверы, ваши запросы обрабатываются разными потоками, а не теми, с которыми вы загружаетесь. Поэтому я предлагаю вам попробовать следующее в вашей процедуре начальной загрузки:

import pythoncom


def onThreadStart(threadIndex):
  pythoncom.CoInitialize()

cherrypy.engine.subscribe('start_thread', onThreadStart)
Другие вопросы по тегам