使用win32com.client.GetActiveObject创建/获取COM对象,然后import pywintypes在每次调用原始COM对象时生成一个AttributeError。
复制代码
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为什么会发生这种情况,如何解决呢?
发布于 2018-09-13 01:35:42
我找到了一个解决这个问题的方法,我想和大家分享一下,但我也想听听关于我的理解的反馈意见,以及应该解决这个问题的合适的依赖性是什么,以防止其他人有同样的问题。
解决方案
在调用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使用标志COINIT_MULTITHREADED调用CoInitializeEx,该标志恰好覆盖win32com.client.GetActiveObject设置的模式。
充分解释
我得出这个结论是因为在pywinauto.__init__中注释掉win32com.client.GetActiveObject(我担心它会杀死从win32com.client.GetActiveObject返回的COM对象)并重新运行代码时,会从comtypes.__init__引发以下错误
OSError: [WinError -2147417850] Cannot change thread mode after it is set我知道comtypes.__init__手机选择了CoInitializeEx的默认标志,无法推断win32com库是如何的,但它可能也在检查现有的标志,所以我添加了import comtypes。
在那里我仍然是模糊的
pythoncom.CoInitializeEx(0x0)之前立即调用win32com.client.GetActiveObject不起作用!如果我能得到上面的答案,我可以向win32com推荐设置sys.coinit_flags (这是comtypes.__init__正在检查的地方)。
重选
https://stackoverflow.com/questions/52305472
复制相似问题