尚未调用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())
问题答案:
我不记得过去几年没有使用COM的确切时间,但我想您必须在使用它的每个线程中初始化COM(同样,我不确定每个COM隔离区)。由于CherryPy是线程服务器,因此您的请求由不同的线程处理,而不是由您引导的线程处理。因此,我建议您在引导程序中尝试以下操作:
import pythoncom
def onThreadStart(threadIndex):
pythoncom.CoInitialize()
cherrypy.engine.subscribe('start_thread', onThreadStart)