python - 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()
我还尝试将“会话”对象定义为函数中的全局对象,这样就不需要将参数发送到线程,但它也对我不起作用。
你能帮我解决这个问题吗?我究竟做错了什么?
提前感谢您的时间!
解决方案
推荐阅读
- javascript - JSONObject toString 方法
- excel-formula - 根据重复列表中的唯一条目查找平均时间
- python - Odoo 10 动态过滤
- javascript - 可以在 Div 的代码中插入 javascript 版本的 print 吗?
- javascript - 如何在突出显示文本时专注于文本框
- java - Hibernate上关系复合主键的问题
- excel - 错误 13:在类似 vba 语句起作用的用户窗体上的文本框类型不匹配
- authentication - 使用 GitHub.js 进行身份验证的最佳方式?
- python - 如何从元组列表字典的所有键中输出所有第一个元素?
- google-cloud-platform - 谷歌云构建