Почему я не могу создать COM-объект в новом потоке в Python?

Я пытаюсь создать COM-объект из dll в новом потоке в Python – поэтому я могу запустить насос сообщений в этом потоке:

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() 

это ошибка, которую я получаю:

 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 

Есть идеи?

    3 Solutions collect form web for “Почему я не могу создать COM-объект в новом потоке в Python?”

    Вам нужно вызвать CoInitialize() (или CoInitializeEx() ) в потоке, прежде чем вы сможете создавать COM-объекты в этом потоке.

     from win32com.client.pythoncom import CoInitialize CoInitialize() 

    Насколько я помню (давно я запрограммировал много с помощью COM-компонентов), вы должны вызвать CoInitialize для каждого потока, если ваш COM-объект использует STA.

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

    Но я не знаю, как назвать эту функцию в python.

    Вот документ MSDN

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

    Просто обновить текущим опытом с помощью PyCharm и Python 2.7: вам нужно импортировать:

     from pythoncom import CoInitializeEx from pythoncom import CoUninitialize 

    затем для запуска потока:

     def run(self): res = CoInitializeEx(0) #<your code> CoUninitialize() 

    PyCharm путают с квартирой STA, вам нужно включить истинную многопоточность.

    Важно, чтобы каждый CoInitialize() был завершен с помощью CoUninitialize() , поэтому убедитесь, что ваш код также следует этому правилу в случае ошибок.

    Python - лучший язык программирования в мире.