调用 xlwings 创建多线程时报错 pywintypes.com_error: ( ‘应用程序调用一个已为另一线程整理的接口)解决方法

创建xlwings对象

import xlwings
def run_program():
	    app = xw.App(visible=False)
    # app = xw.App(visible=False, add_book=False)  # 创建不可见的 Excel 应用程序实例
    app.display_alerts = False  # 关闭 Excel 的警报
    app.screen_updating = False  # 关闭 Excel 的屏幕更新
    wb = xw.Book(rule_file)

当开启多线程

   try:
        thread1=threading.Thread(target=run_program)
        thread1.start()
    except Exception as re:
        #  check_list.writeErroLog(re)
        traceback.print_exc(file=open('erro_log.txt','w+'))
   **

这时候报错

**

   Exception in thread Thread-1:
Traceback (most recent call last):
  File "D:\ProgramData\Anaconda3\envs\python38\lib\threading.py", line 932, in _bootstrap_inner
    self.run()
  File "D:\ProgramData\Anaconda3\envs\python38\lib\threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)
  File "XXXXXX/main.py", line 135, in run_program
    result_arr = rf1.Read_FormulaValue_1(rule_file, sheet_data, sheet_name, num_rows, num_cols, first_row)
  File "XXXXXX", line 249, in Read_FormulaValue_1
    app.quit()
  File "D:\ProgramData\Anaconda3\envs\python38\lib\site-packages\xlwings\main.py", line 300, in quit
    return self.impl.quit()
  File "D:\ProgramData\Anaconda3\envs\python38\lib\site-packages\xlwings\_xlwindows.py", line 368, in quit
    self.xl.DisplayAlerts = False
  File "D:\ProgramData\Anaconda3\envs\python38\lib\site-packages\xlwings\_xlwindows.py", line 107, in __setattr__
    return setattr(self._inner, key, value)
  File "D:\ProgramData\Anaconda3\envs\python38\lib\site-packages\win32com\client\__init__.py", line 595, in __setattr__
    self._oleobj_.Invoke(*(args + (value,) + defArgs))
pywintypes.com_error: (-2147417842, '应用程序调用一个已为另一线程整理的接口。', None, None)

需要加入pythoncom.CoInitialize(),进行初始化。

def run_program():
	pythoncom.CoInitialize()
	...其他代码

这样就能正常运行。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Delphi线程池实现多线程FTP分段下载组件 by :renshouren mail:114032666@qq.com QQ:114032666 2019.10.05 使用的组件 1、TIdFTP Indy FTP客户端 2、TThreadsPool 线程池 工作原理及流程 调用本单元,将自动在程序初始化生成线程池TThreadPoolDown实例 Share_ThreadPool_FTPDown 一、外部调用方法 外部只需要一次性调用 FtpDown() 函数向线程池加入下载任务,下载任务执行中的事件会通过调用注册的 回调函数 AFtpDownEvent 进行通知。 二、内部工作流程 1、FtpDown()函数将调用TThreadPoolDown.AddFtpDown() ,然后调用TADownFileObj.MakeGetFileSizeObj()分配线程任务 本过程中,将向回调函数 AFtpDownEvent 触发 HEM_ADDURL 事件通知 2、工作线程调用任务对象TFTPHeadObj.DoThreadExecute 过程获取远程文件大小 备注:该功能实际使用到FTP命令SIZE,该命令一些老版本FTP服务器有可能不支持 本过程中,若获取文件大小成功,将向回调函数 AFtpDownEvent 触发 HEM_GETSIZE 事件通知, 若失败,则触发 HEM_ERROR 事件通知 3、得到远程文件大小后,调用TADownFileObj.MakeGetObjs(),分配获取远程文件线程任务 本过程中,开始,将向回调函数 AFtpDownEvent 触发 HEM_WORKBEGIN 事件通知 在接收数据,向回调函数 AFtpDownEvent 触发 HEM_WORK 事件通知 4、工作线程调用任务对象 TFTPGetObj.DoThreadExecute 实际下载远程文件数据块 每一个数据块下载任务完成后,触发 HEM_BLOCKOK 事件通知 5、所有数据块完成后,将调用 DoDownloadOK 函数,触发 HEM_DOWNOK 事件通知

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值