win32com.client.Dispatch + Cherrypy = CoInitialize 没有被调用
Posted
技术标签:
【中文标题】win32com.client.Dispatch + Cherrypy = CoInitialize 没有被调用【英文标题】:win32com.client.Dispatch + Cherrypy = CoInitialize has not been called 【发布时间】:2014-12-31 23:04:15 【问题描述】:以下代码运行良好,但如果从 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())
【问题讨论】:
有关 CoInitialize 和其他 COM 功能的文档请参阅 MSDN 【参考方案1】:我不记得去年我没有使用 COM,但我想您必须在使用它的每个线程中初始化 COM(同样我不确定每个 COM 隔间)。由于 CherryPy 是线程服务器,您的请求由不同的线程处理,而不是您引导的线程。因此,我建议您在引导程序中尝试以下操作:
import pythoncom
def onThreadStart(threadIndex):
pythoncom.CoInitialize()
cherrypy.engine.subscribe('start_thread', onThreadStart)
【讨论】:
以上是关于win32com.client.Dispatch + Cherrypy = CoInitialize 没有被调用的主要内容,如果未能解决你的问题,请参考以下文章