获取win32com自动化对象的基础OLE对象标识

时间:2014-09-26 21:56:33

标签: python-2.x win32com sas-jmp

大多数内置的Python数据类型和库都指向返回同一个对象a is b,而不仅仅是a==b),即使你在不同的情况下要求它方法。一个非常简单的例子:

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,只有一些方法,其中没有一个方法与对象标识问题相关。但是,repr()的{​​{1}}似乎指向底层的OLE自动化对象:

_oleobj_

为了确认两个对象引用相同的底层OLE对象,我使用了解析print table._oleobj_ print same_table._oleobj_ # <PyIDispatch at 0x0000000003459530 with obj at 0x00000000003E2928> # <PyIDispatch at 0x0000000003459620 with obj at 0x00000000003E2928> 字符串并比较十六进制地址(“repr()”)。

使用obj at 0x...比较OLE对象标识有更好,更清晰的方法吗?

1 个答案:

答案 0 :(得分:1)

*面对自我*

事实证明这是一种非常简单的方法: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