¿Por qué no puedo crear un objeto COM en un nuevo hilo en Python?

Estoy tratando de crear un objeto COM a partir de una dll en un nuevo hilo en Python, por lo que puedo ejecutar una bomba de mensajes en ese hilo:

from comtypes.client import CreateObject import threading class MessageThread(threading.Thread): def __init__(self): threading.Thread.__init__(self) self.daemon = True def run(self): print "Thread starting" connection = CreateObject("IDMessaging.IDMMFileConnection") print "connection created" a = CreateObject("IDMessaging.IDMMFileConnection") print "aConnection created" t = MessageThread() t.start() 

esta es la traza de error que recibo:

 aConnection created Thread starting >>> Exception in thread Thread-1: Traceback (most recent call last): File "c:\python26\lib\threading.py", line 532, in __bootstrap_inner self.run() File "fred.py", line 99, in run self.connection = CreateObject("IDMessaging.IDMMFileConnection") File "c:\python26\lib\site-packages\comtypes\client\__init__.py", line 235, in CreateObject obj = comtypes.CoCreateInstance(clsid, clsctx=clsctx, interface=interface) File "c:\python26\lib\site-packages\comtypes\__init__.py", line 1145, in CoCreateInstance _ole32.CoCreateInstance(byref(clsid), punkouter, clsctx, byref(iid), byref(p)) File "_ctypes/callproc.c", line 925, in GetResult WindowsError: [Error -2147221008] CoInitialize has not been called 

¿Algunas ideas?

CoInitialize() haber llamado a CoInitialize() (o CoInitializeEx() ) en un hilo antes de poder crear objetos COM en ese hilo.

 from win32com.client.pythoncom import CoInitialize CoInitialize() 

Por lo que recuerdo (hace mucho tiempo que programé mucho con los componentes COM), debe llamar a CoInitialize en cada hilo si su objeto COM usa STA.

http://msdn.microsoft.com/en-us/library/ms678543(VS.85).aspx

Pero no tengo idea de cómo llamar a esa función en Python.

Aquí está el Doc MSDN

http://msdn.microsoft.com/en-us/library/ms678543(VS.85).aspx

Solo para actualizar con la experiencia actual usando PyCharm y Python 2.7: Necesita importar:

 from pythoncom import CoInitializeEx from pythoncom import CoUninitialize 

entonces para ejecutar el hilo:

 def run(self): res = CoInitializeEx(0) # CoUninitialize() 

PyCharm se confunde con el apartamento STA, debe habilitar el multihilo verdadero.

Es importante que cada CoInitialize() termine con un CoUninitialize() , así que asegúrese de que su código siga esta regla en caso de errores, también.