首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >导入pywinauto (或comtype)现有的COM对象

导入pywinauto (或comtype)现有的COM对象
EN

Stack Overflow用户
提问于 2018-09-13 01:35:42
回答 1查看 1.2K关注 0票数 3

使用win32com.client.GetActiveObject创建/获取COM对象,然后import pywintypes在每次调用原始COM对象时生成一个AttributeError

复制代码

代码语言:javascript
复制
import win32com.client
catia_com = win32com.client.GetActiveObject('CATIA.Application')

# then later when needed, do some pywinauto stuff
import pywinauto.application

# back to working directly on catia com object
print(catia.caption)  # raises Attribute error from within win32com.client

为什么会发生这种情况,如何解决呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-13 01:35:42

我找到了一个解决这个问题的方法,我想和大家分享一下,但我也想听听关于我的理解的反馈意见,以及应该解决这个问题的合适的依赖性是什么,以防止其他人有同样的问题。

解决方案

在调用import comtypes之前添加win32com.client

示例

代码语言:javascript
复制
import comtypes
import win32com.client
catia_com = win32com.client.GetActiveObject('CATIA.Application')

# then later when needed, do some pywinauto stuff
import pywinauto.application

# back to working directly on catia com object
print(catia.caption)  # it works!

原因和解释(尽我所能确定)

TLDR

import comtypes使用标志COINIT_MULTITHREADED调用CoInitializeEx,该标志恰好覆盖win32com.client.GetActiveObject设置的模式。

充分解释

我得出这个结论是因为在pywinauto.__init__中注释掉win32com.client.GetActiveObject(我担心它会杀死从win32com.client.GetActiveObject返回的COM对象)并重新运行代码时,会从comtypes.__init__引发以下错误

代码语言:javascript
复制
OSError: [WinError -2147417850] Cannot change thread mode after it is set

我知道comtypes.__init__手机选择了CoInitializeEx的默认标志,无法推断win32com库是如何的,但它可能也在检查现有的标志,所以我添加了import comtypes

在那里我仍然是模糊的

  1. 如何确定win32com的并发模型标志是什么?
  2. 如何在调用win32com.client.GetActiveObject时指定并发模型标志?
  3. 为什么这个解决方案有效..。在调用pythoncom.CoInitializeEx(0x0)之前立即调用win32com.client.GetActiveObject不起作用!

如果我能得到上面的答案,我可以向win32com推荐设置sys.coinit_flags (这是comtypes.__init__正在检查的地方)。

重选

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52305472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档