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 没有被调用的主要内容,如果未能解决你的问题,请参考以下文章

使用 win32com.client 模块在 Python 中将 .XLSX 转换为 .XLS

Python使用win32com创建Access数据库

python 操作ACCESS数据库中 如何删除记录

Python语音识别(计算器)

如何在Python 中导入access 数据

Python 基于win32com客户端实现Excel操作