2014-11-04 31 views
3

下面的代码效果很好,但它未能如果从应用程序的CherryPy方法与错误消息CoInitialize has not been called执行:win32com.client.Dispatch +的CherryPy = CoInitialize的没有被调用

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

有关的CoInitialize和其他COM函数文档查看MSDN – jwalker 2014-11-10 08:31:58

回答

6

我记不太清楚了,因为我没有用COM过去几年的工作,但我猜你在每次使用它的线程初始化COM (再次我不确定每个COM分区)。由于CherryPy是线程服务器,您的请求由不同的线程处理,而不是您引导的。因此,我建议你尝试在你的引导例程如下:

import pythoncom 


def onThreadStart(threadIndex): 
    pythoncom.CoInitialize() 

cherrypy.engine.subscribe('start_thread', onThreadStart) 
相关问题