我一直在运行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'
在我运行makepy之前,Name一直是块的可访问属性。我已经尝试重新安装python for windows,看看是否会重置它,但它没有用。
makepy是否会在我需要删除的实现时创建另一个文件?
我的很多脚本都依赖于Name属性。非常感谢您提供的任何建议或帮助。
答案 0 :(得分:1)
此属性错误的主要原因是因为您的COM服务器已从后期绑定(动态)更改为早期绑定(静态)。
有两种方法可以解决此问题:
使用动态模块来强制您的代码以面向后期的方式工作。使用示例:
"win32com.client.dynamic.Dispatch()" instead of "win32com.client.Dispatch()"
使用面向驼峰的敏感关键字作为面向早期绑定的方式。使用示例:
"excel.Visible()" instead of "excel.VISIBLE()" or "excel.visible()"
因此,请尝试使用dynamic.Dispatch或区分大小写的变量名。
答案 1 :(得分:0)
当我运行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说&#34; ...对象没有属性......&#34;。
所以我删除了win32com \ gen_py目录中的所有文件,但保留了gen_py目录,现在没问题了。