win32com.client.Dispatch + Cherrypy = CoInitialize尚未调用

时间:2014-11-04 21:44:54

标签: python python-3.x cherrypy win32com

以下代码运行良好,但如果从CherryPy应用程序方法执行并且错误消息CoInitialize has not been called,则会失败:

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

This post建议一个适合我的解决方案:

import pythoncom
pythoncom.CoInitialize()

我在问我已经有解决方案的问题的原因是(1)我想知道我在做什么(而不仅仅是因为我'已经看到它工作了一次)和(2)我不想冒险错过重要的事情(阅读this post让我觉得我错过了什么。)

我无法找到pythoncom.CoInitialize()的任何文档,而pythoncom的来源是以下三行对我没有帮助(Eclipse + pydev也没有说明该方法不存在) ):

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

1 个答案:

答案 0 :(得分:8)

我记不清楚,因为去年我没有使用COM,但我想你必须在你使用它的每一个线程中初始化COM(我再也不确定每个COM隔间)。由于CherryPy是线程服务器,因此您的请求由不同的线程处理,而不是您自行引导的线程。因此,我建议您在引导程序中尝试以下操作:

import pythoncom


def onThreadStart(threadIndex):
  pythoncom.CoInitialize()

cherrypy.engine.subscribe('start_thread', onThreadStart)