gpt4 book ai didi

python-2.x - 获取 win32com 自动化对象的底层 OLE 对象标识

转载 作者:行者123 更新时间:2023-12-02 05:03:26 25 4
gpt4 key购买 nike

大多数内置 Python 数据类型和库都会返回相同的对象(a is b,而不仅仅是 a==b code>) 即使您以不同的方式请求它。一个非常简单的例子:

list = [ "foo", "bar", {"name": [1,2,3]} ]
a = list[-1]["name"]
b = list[2].values()[0]
print (a is b) # True!

但是,对于 win32com 自动化返回的多种非标量对象来说,情况似乎并非如此。以下代码连接到 自动化,然后获取同一数据表对象的两个句柄。在 Python 级别,这两个自动化对象不共享标识:

from win32com.client import gencache
mod = gencache.GetModuleForProgID("JMP.Application")
app = mod.Application()
table = app.GetTableHandleFromName("Table1")
same_table = app.GetTableHandleFromName("Table1")
print table
print same_table
print table is same_table
# <win32com.gen_py.DCD36DE0-78F8-11CF-9E68-0020AF24E9FEx0x1x0.IAutoDataTable instance at 0x54418504>
# <win32com.gen_py.DCD36DE0-78F8-11CF-9E68-0020AF24E9FEx0x1x0.IAutoDataTable instance at 0x54432456>
# False

看来所有 win32com OLE 自动化对象也有 _oleobj_ 属性。 _oleobj_ 是一个 PyIDispatch object ,它只有几个方法,似乎都与对象身份问题无关。但是,_oleobj_repr() 似乎指向底层 OLE 自动化对象:

print table._oleobj_
print same_table._oleobj_
# <PyIDispatch at 0x0000000003459530 with obj at 0x00000000003E2928>
# <PyIDispatch at 0x0000000003459620 with obj at 0x00000000003E2928>

为了确认两个对象引用相同的底层 OLE 对象,我采用了解析 repr() 字符串并比较十六进制地址(“obj at 0x. ..”)。

是否有更好、更简洁的方法来使用 win32com 比较 OLE 对象标识?

最佳答案

*打自己的脸*

事实证明,有一种非常简单的方法可以做到这一点:http://mail.python.org/pipermail/python-win32/2014-October/013288.html

虽然 is 运算符不起作用,因为 Python 对象是不同的,但 == 对象通过 win32com 实现了此目的-包装对象:

from win32com.client import gencache
mod = gencache.GetModuleForProgID("JMP.Application")
app = mod.Application()
table = app.GetTableHandleFromName("Table1")
same_table = app.GetTableHandleFromName("Table1")
print table is same_table, table._oleobj_ is same_table._oleobj_
print table==same_table, table._oleobj_==same_table._oleobj_
# False, False
# True, True

关于python-2.x - 获取 win32com 自动化对象的底层 OLE 对象标识,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26068864/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com