我能够找到一个我想分享的解决方案,但我也想听听关于我的理解的反馈,以及应该解决什么是适当的依赖关系,以防止其他人遇到同样的问题。
解决方案
import comtypes
调用前添加win32com.client
。
例子
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
CoInitializeEx
带有标志的调用COINIT_MULTITHREADED
恰好覆盖了 . 设置的模式win32com.client.GetActiveObject
。
完整解释
我得出这个结论是因为在注释掉pythoncom.CoUninitialize()
(我担心它会杀死从返回的 COM 对象win32com.client.GetActiveObject
)pywinauto.__init__
并重新运行代码时,会引发以下错误comtypes.__init__
:
OSError: [WinError -2147417850] Cannot change thread mode after it is set
我知道comtypes.__init__
Handels 选择默认标志CoInitializeEx
并且无法推断win32com
lib 是如何但认为它也可能正在检查现有标志,所以我添加了import comtypes
.
我仍然模糊的地方
- 您如何确定 win32com 的并发模型标志是什么?
- 调用 win32com.client.GetActiveObject 时如何指定并发模型标志?
- 为什么该解决方案确实有效...
pythoncom.CoInitializeEx(0x0)
在调用 win32com.client.GetActiveObject 之前直接调用不起作用!
如果我能得到上述答案,我可以向 win32com 推荐设置sys.coinit_flags
(这comtypes.__init__
是检查的地方)。
资源