win32com.client.Dispatch + Cherrypy = CoInitialize has not been called 使用win32com.client.Dispatch和Cherrypy时出现错误:CoInitialize未被调用。

12
以下代码运行良好,但如果从CherryPy应用程序方法中执行,则会出现错误消息CoInitialize未被调用:
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
有关CoInitialize和其他COM函数的文档,请参阅MSDN。 - jwalker
1个回答

16

我记不清楚了,因为我已经好几年没用COM了,但我猜想你需要在每个线程中初始化COM(我对于每个COM隔间并不确定)。由于CherryPy是多线程服务器,您的请求会由不同的线程处理,而不是您启动引导程序的那个线程。因此,我建议您在启动引导程序中尝试以下操作:

import pythoncom


def onThreadStart(threadIndex):
  pythoncom.CoInitialize()

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接