https://mail.python.org/pipermail/python-win32/2004-October/002582.html完美地总结了我的问题(只需稍作修改就可以针对我的案例进行更新):
I would like to have a Word Document instance with all methods and properties visible during interactive session. This is my currnet apporach:
>>> from win32com.client import gencache, Dispatch >>> gencache.EnsureModule('{00020905-0000-0000-C000-000000000046}', 0, 8, 1, bForDemand=True) <module 'win32com.gen_py.00020905-0000-0000-C000-000000000046x0x8x1' from 'C:\DOCUME~1\osuchw\LOCALS~1\Temp\gen_py\2.3\00020905-0000-0000-C000-000000000046x0x8x1\__init__.py'> >>> word = Dispatch('Word.Application') >>> word <win32com.gen_py.Microsoft Word 12.0 Object Library._Application instance at 0x18074720> >>> doc = word.Documents.Add() >>> doc <win32com.gen_py.None.Document>
As you can see I am getting a dynamic object not knowing its methods/properties. What I would like to get is something like:
>>> doc = Dispatch('Word.Document') >>> doc <win32com.gen_py.Microsoft Word 12.0 Object Library._Document instance at 0x37038040>
我想我还需要从另一个类型库(例如,有“office12.0对象库”)生成一个包装器,但是没有任何提示。同样,在HKEY_CLASSES_ROOT\CLSID\{00020906-0000-0000-C000-000000000046}
处没有TypeLib
子键,doc.CLSID
就是这样产生的。在
这个线程中唯一的答案指向RTFM一本关于Word编程的普通书籍,没有任何提示(我严重怀疑它甚至提到typelibs)。在
最后,我用以下代码为机器上的所有类型库生成包装器:
import win32com.client.selecttlb
ii=win32com.client.selecttlb.EnumTlbs()
ii=[i.desc for i in ii]
# one typelib - "Visual Basic runtime objects and procedures [6.0]" - produced an error
for i in ii: subprocess.call(['python','-m','win32com.client.makepy',i])
但即使在这种情况下,它仍然是win32com.gen_py.None.Document
。在
最奇怪的是对象的类被识别并存在于缓存中:
^{pr2}$同时,VBA编辑器和VBSEdit列表w.ActiveDocument
的成员都很好。他们是怎么做到的,为什么pythoncom
不能这样做?在
d._dispobj_
包含所有成员,因此可以使用它来代替d
。在眼前的问题解决了。在
但我还是不知道发生了什么。在
相关问题 更多 >
编程相关推荐