Using win32com with multithreading Using win32com with multithreading multithreading multithreading

Using win32com with multithreading


If you want to use win32com in multiple threads you need to do a little bit more work as COMObject cannot be passed to a thread directly. You need to use CoMarshalInterThreadInterfaceInStream() and CoGetInterfaceAndReleaseStream() to pass instance between threads:

import pythoncom, win32com.client, threading, timedef start():    # Initialize    pythoncom.CoInitialize()    # Get instance    xl = win32com.client.Dispatch('Excel.Application')    # Create id    xl_id = pythoncom.CoMarshalInterThreadInterfaceInStream(pythoncom.IID_IDispatch, xl)    # Pass the id to the new thread    thread = threading.Thread(target=run_in_thread, kwargs={'xl_id': xl_id})    thread.start()    # Wait for child to finish    thread.join()def run_in_thread(xl_id):    # Initialize    pythoncom.CoInitialize()    # Get instance from the id    xl = win32com.client.Dispatch(            pythoncom.CoGetInterfaceAndReleaseStream(xl_id, pythoncom.IID_IDispatch)    )    time.sleep(5)if __name__ == '__main__':    start()

For more info see: https://mail.python.org/pipermail/python-win32/2008-June/007788.html


Try using multiprocessing. Worked for me, after a long search.

from multiprocessing import Processp = Process(target=test, args=())p.start()p.join()