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)