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