Python多线程下调用win32com包相关问题:pywintypes.com_error: (-2147221008, ‘尚未调用 CoInitialize。‘, None, None)问题处理

报错1:
pywintypes.com_error: (-2147221008, '尚未调用 CoInitialize。', None, None)

场景:
我是用 flask 服务操作接收的请求,通过 xlwings 库读取 excel

问题原因:
多线程下使用 win32com 的话,前面必须调用 CoInitialize,而 xlwings 读取 excel 正好用到了 win32com

解决方法:
导入 pythoncom 库,如果没有的话可以通过 pip install pywin32 安装。
然后线程前面加一句这个即可 pythoncom.CoInitialize()

import pythoncom

# 多线程
thread():
	# 这个必须有
	pythoncom.CoInitialize()
	
	# 其它代码
	...
	
	# 这个可有可无
	pythoncom.CoUninitialize()

报错2:
pywintypes.com_error: (-2147417842, '应用程序调用一个已为另一线程整理的接口。', None, None)
如果创建 xlwings 对象的过程在外面,读取的过程在里面会报这个错。
问题代码示例:

import pythoncom

# 创建xlwings对象
app = xlwings.App(visible=False, add_book=False)

# flask下的路由
@app_flask.route('/get_data/<command>')
@cross_origin()
def get_data(command):
    pythoncom.CoInitialize()
	
	# 使用xlwings对象打开excel
    wt = app.books.open(path_xl_new1)
    
    # 其它代码
	...
	
	pythoncom.CoUninitialize()

正确代码示例:

import pythoncom

# flask下的路由
@app_flask.route('/get_data/<command>')
@cross_origin()
def get_data(command):
    pythoncom.CoInitialize()
	
	# 创建xlwings对象也放在里面
	app = xlwings.App(visible=False, add_book=False)
	# 使用xlwings对象打开excel
    wt = app.books.open(path_xl_new1)
    
    # 其它代码
	...
	
	pythoncom.CoUninitialize()

喜欢的点个赞❤吧!

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: 这是一个Python错误信息,意思是“pywintypes.com_error: (-2147221008, '尚未调用 coinitialize。', none, none)”。它表示在使用COM对象时,需要先调用“coinitialize”函数进行初始化,否则会出现这个错误。 ### 回答2: pywintypes.com_error: (-2147221008, '尚未调用 coinitialize。', none,none)是Windows下一种常见的错误。这个错误的解决方法是调用Coinitialize()函数,该函数在COM组件中初始化线程,以便在后续线程中使用COM接口。 CO初始化是Windows COM编程中非常重要的一部分,它为组件提供了对系统资源的访问,并为组件提供了线程模型。如果您没有调用Coinitialize(),那么您将不能正确地使用COM组件与系统交互。 使用COM编程时可能会遇到多线程的情况,因为多线程会带来许多问题括并发问题和同步问题。这正是Coinitialize()要解决的问题。它将启用对系统资源的访问和对象外壳的创建,从而确保您正确使用线程模型。 因此,如果你在Windows环境下使用COM组件时遇到类似的问题,你可以按照以下步骤解决: 1. 在您的代码中添加Coinitialize()函数 2. 在您的代码的结尾处调用CoUninitialize()函数以防止资源泄漏 Coinitialize()函数的语法如下: HRESULT CoInitialize(LPVOID pvReserved); 其中pvReserved参数为NULL,返回值为S_OK,初始化成功。 在实际编程中,您通常可以使用如下代码: import win32com.client import pythoncom pythoncom.CoInitialize() # 初始化线程 try: # 进行COM编程 ... finally: pythoncom.CoUninitialize() # 清理资源 使用该方法可以在您的应用程序中正确地使用COM接口并避免python中的pywintypes.com_error: (-2147221008, '尚未调用 coinitialize。', none,none)错误。 ### 回答3: 这个错误是PythonWindows开发扩展( pywin32 )提供的一个异常,表示调用COM对象的程序尚未初始化或未成功初始化。COM是一种通信协议,用于在Windows操作系统中的组件之间进行通信。与许多其他编程语言一样,Python 通过调用Windows API 来实现与COM组件的交互。但是,在使用COM组件之前,必须调用一次初始化函数:CoInitialize或CoInitializeEx。如果初始化失败,则无法使用该COM对象,此时就会抛出此错误。 这个问题通常是由以下原因引起的: 1.程序未调用CoInitialize或CoInitializeEx初始化函数。在使用COM组件之前,每个线程必须调用一次初始化函数。如果线程已经成功初始化,则多次调用该函数将被忽略。如果线程未成功初始化,则程序使用COM对象时会出现错误。要解决这个问题,程序应该确保在使用COM对象之前,每个线程都调用了初始化函数。 2.程序在未释放COM对象的情况下结束。COM对象是由COM Runtime自动管理的资源,当程序退出时自动释放。如果程序在未释放COM对象的情况下崩溃或结束,则会出现内存泄漏。要解决这个问题,程序应该在使用COM对象后显式地调用COM对象的Release方法,确保及时释放资源。 因此,要解决这个问题,程序员需要确定在使用COM对象之前,每个线程都必须调用一次初始化函数。并在程序退出前显示释放所有COM资源。如果还存在其他问题,可以通过检查COM对象状态来排除问题。最终,程序员需要确保通过测试来保证程序对COM组件的正确使用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

挣扎的蓝藻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值