2

我已经运行win32comAutoCAD 很长一段时间没有问题。我了解到应用该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属性。您可以提供的任何建议或帮助将不胜感激。

4

2 回答 2

3

此属性错误的主要原因是您的 COM 服务器已从后期绑定(动态)转换为早期绑定(静态)。

  • 在后期绑定中,每当调用方法时,都会向对象查询该方法,如果成功,则可以进行调用。
  • 在早期绑定中,对象模型的信息是根据对象调用提供的类型信息预先确定的。早期绑定使用 MakePy。此外,早期绑定区分大小写。

有两种方法可以解决此问题:

  1. 使用动态模块强制您的代码以面向后期绑定的方式工作。示例使用:

    win32com.client.dynamic.Dispatch()代替win32com.client.Dispatch()

  2. 对早期绑定方式使用骆驼大小敏感关键字。示例使用:

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

所以尝试使用dynamic.Dispatch或区分大小写的变量名。

于 2018-08-23T20:46:50.463 回答
1

我在运行win32com访问 DELMIA 时遇到了类似的问题。我发现 delmia 有很多 com 文件作为.tlb文件。当我输入:

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

Python 会自动在win32com\gen_py目录中生成一些东西,与 Word 或 Excel 的示例相同。但是,不同之处在于生成的内容仅来自一个.tlbdelmia 文件。如果我访问 `.tlb 中的某个变量,没关系:

docs = delmia.Documents

如果我访问 other 中的某个变量.tlb,我会收到类似的错误:

pdoc = docs.Add('Process')

Python 说:

...对象没有属性...

所以我删除了目录中的所有文件win32com\gen_py但保留了gen_py目录,现在可以了。

于 2015-03-26T06:32:00.187 回答