首页 > 解决方案 > python 3.x - CoInitialize 没有被多线程调用

问题描述

我正在尝试在 Python 3.x 中设置多线程代码。我创建了 2 个要同时执行的函数,以便在 SAP GUI 中的 2 个不同会话中执行 2 个事务。

不幸的是,当我执行它时,我面临以下问题:

问题

    Exception in thread Thread-32:
Traceback (most recent call last):
  File "C:\Users\MCASTROM\Miniconda3\lib\threading.py", line 954, in _bootstrap_inner
Exception in thread Thread-31:
Traceback (most recent call last):
  File "C:\Users\MCASTROM\Miniconda3\lib\threading.py", line 954, in _bootstrap_inner
    self.run()
  File "C:\Users\MCASTROM\Miniconda3\lib\threading.py", line 892, in run
    self.run()
  File "C:\Users\MCASTROM\Miniconda3\lib\threading.py", line 892, in run
    self._target(*self._args, **self._kwargs)
  File "C:\Users\MCASTROM\Documents\py\CursoPython\Fase 4 - Temas avanzados\Tema 14 - Bases de datos con SQLite\untitled1.py", line 63, in s2
    self._target(*self._args, **self._kwargs)
  File "C:\Users\MCASTROM\Documents\py\CursoPython\Fase 4 - Temas avanzados\Tema 14 - Bases de datos con SQLite\untitled1.py", line 58, in s1
  File "<COMObject <unknown>>", line 2, in findById
  File "<COMObject <unknown>>", line 2, in findById
pywintypes.com_error: (-2147221008, 'CoInitialize has not been called.', None, None)
pywintypes.com_error: (-2147221008, 'CoInitialize has not been called.', None, None)

代码示例

from threading import Thread
import win32com.client
import sys
import time


   
try:
    
    SapGuiAuto = win32com.client.GetObject("SAPGUI")
    if not type(SapGuiAuto) == win32com.client.CDispatch:
        print("error")
    
    application = SapGuiAuto.GetScriptingEngine
    if not type(application) == win32com.client.CDispatch:
        SapGuiAuto = None 

    
    connection = application.Children(0)
    session = connection.Children(0)
    session2 = connection.Children(1)
except:
    print("error")

session.findById("wnd[0]/tbar[0]/okcd").text = "fbl3n"
session.findById("wnd[0]").sendVKey(0)
session.findById("wnd[0]/usr/radX_AISEL").select
session.findById("wnd[0]/usr/ctxtSD_SAKNR-LOW").text = "45600000"
session.findById("wnd[0]/usr/ctxtSD_SAKNR-HIGH").text = "45609999"
session.findById("wnd[0]/usr/ctxtSD_BUKRS-LOW").text = "1724"
session.findById("wnd[0]/usr/ctxtSO_BUDAT-LOW").text = "01.08.2021"
session.findById("wnd[0]/usr/ctxtSO_BUDAT-HIGH").text = "31.08.2021"
session.findById("wnd[0]/usr/ctxtPA_VARI").text = "/FI PA SUMAR"
session.findById("wnd[0]/usr/ctxtPA_VARI").setFocus
session.findById("wnd[0]/usr/ctxtPA_VARI").caretPosition = 12

session2.findById("wnd[0]/tbar[0]/okcd").text = "fbl3n"
session2.findById("wnd[0]").sendVKey(0)
session2.findById("wnd[0]/usr/radX_AISEL").select
session2.findById("wnd[0]/usr/ctxtSD_SAKNR-LOW").text = "45600000"
session2.findById("wnd[0]/usr/ctxtSD_SAKNR-HIGH").text = "45609999"
session2.findById("wnd[0]/usr/ctxtSD_BUKRS-LOW").text = "1724"
session2.findById("wnd[0]/usr/ctxtSO_BUDAT-LOW").text = "01.08.2021"
session2.findById("wnd[0]/usr/ctxtSO_BUDAT-HIGH").text = "31.08.2021"
session2.findById("wnd[0]/usr/ctxtPA_VARI").text = "/FI PA SUMAR"
session2.findById("wnd[0]/usr/ctxtPA_VARI").setFocus
session2.findById("wnd[0]/usr/ctxtPA_VARI").caretPosition = 12

def s1(p):
    
    
    p.findById("wnd[0]/tbar[1]/btn[8]").press

def s2(p):
    
    
    p.findById("wnd[0]/tbar[1]/btn[8]").press


if __name__ == '__main__':
    t3 = Thread(target=s1, args=(session,))
    t4 = Thread(target=s2, args=(session2,))
        
    t3.start()
    t4.start()
    
    t3.join()

我还尝试将“会话”对象定义为函数中的全局对象,这样就不需要将参数发送到线程,但它也对我不起作用。

你能帮我解决这个问题吗?我究竟做错了什么?

提前感谢您的时间!

标签: pythonpython-3.xmultithreadingsap-gui

解决方案


推荐阅读