通过makepy为AutoCAD添加了typelib,现在win32com无法用于AutoCAD

2 投票
2 回答
1126 浏览
提问于 2025-04-17 11:10

我一直在使用 win32com 来访问 AutoCAD,之前没有遇到过什么问题。后来我了解到使用 makepy 工具可以让交互式提示变得更友好,于是我运行了它,并添加了“AutoCAD 2006 类型库”。可是,现在一些我之前常用的属性不见了。比如下面这段代码:

acad = win32com.client("AutoCAD.Application")
doc = acad.Documents.Open('mydoc.dwg')
ms = doc.ModelSpace
count = ms.Count #counts all entities in dwg

for i in range(count):
    item = ms.Item(i)
    if 'block' in item.ObjectName.lower():
        print item.Name
Traceback (most recent call last):
File "<interactive input>", line 1, in <module>
File "C:\Python27\lib\site-packages\win32com\client\__init__.py", line 462, in 
  __getattr__ raise AttributeError("'%s' object has no attribute '%s'" 
  (repr(self),attr))
AttributeError: '<win32com.gen_py.AutoCAD 2006 Type Library.IAcadEntity instance 
  at 0x34894552>' object has no attribute 'Name'

Name 一直是一个可以访问的块属性,直到我运行了 makepy。我尝试重新安装 Windows 版的 Python,想看看能否恢复,但没有成功。

请问运行 makepy 后是否会生成一个我需要删除的文件?

我的很多脚本都依赖于 Name 属性。如果你能提供一些建议或帮助,我将非常感激。

2 个回答

1

我在运行 win32com 来访问 DELMIA 时遇到了类似的问题。我发现 DELMIA 有很多和 COM 相关的东西,都是 .tlb 文件。当我输入:

from win32com.client.gencache import EnsureDispatch
EnsureDispatch('DELMIA.Application')

Python 会自动在 win32com\gen_py 目录下生成一些东西,这和 Word 或 Excel 的例子是一样的。不过,不同的是,这些生成的东西只来自于 DELMIA 的一个 .tlb 文件。如果我访问这个 .tlb 文件里的某个变量,那是没问题的:

docs = delmia.Documents

但是如果我访问其他 .tlb 文件里的某个变量,就会出现类似的错误:

pdoc = docs.Add('Process')

Python 会提示:

... 对象没有这个属性 ...

所以我把 win32com\gen_py 目录下的所有文件都删除了,但保留了 gen_py 目录,现在就没问题了。

3

这个属性错误的主要原因是你的COM服务器从“晚绑定”(动态绑定)变成了“早绑定”(静态绑定)。

  • 在晚绑定中,每次调用一个方法时,系统会查询这个对象是否有这个方法,如果找到了,就可以调用。
  • 在早绑定中,系统会提前根据对象调用提供的类型信息来确定对象模型的信息。早绑定使用了MakePy工具。而且,早绑定对大小写是敏感的。

解决这个问题有两种方法:

  1. 使用动态模块,强制你的代码以晚绑定的方式工作。使用示例:

    win32com.client.dynamic.Dispatch() 而不是 win32com.client.Dispatch()

  2. 使用大小写敏感的关键字,以早绑定的方式工作。使用示例:

    excel.Visible() 而不是 excel.VISIBLE()excel.visible()

所以可以尝试使用 dynamic.Dispatch 或者注意变量名的大小写。

撰写回答