2012-01-26 260 views
1

我一直在运行win32com访问AutoCAD一段时间没有问题。我了解到,应用makepy工具可以在交互式提示中创建更友好的用户体验,因此我运行它并添加了“AutoCAD 2006 Type Library”。现在,我用来访问的一些常见属性不再可用。考虑下面的代码:通过makepy为AutoCAD添加typelib,现在win32com不适用于AutoCAD

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之前,名称一直是块的可访问属性。我试过重新安装python for windows来查看是否会重置它,但它不起作用。

makepy会在我需要删除的实现中创建另一个文件吗?

所以我的许多脚本都依赖于Name属性。任何建议或帮助您可以提供将不胜感激。

+1

嗯,我发现一个gen_py目录位于与该问题相关的Temp目录中。删除gen_py目录后,一切都会相应地再次运行。猜猜在makepy和AutoCAD之间有api的bug? 当我解析它生成的文件时,我看到'Name'是acdbBlock/acdbBlockReference类的属性。不知道为什么我在运行脚本时没有注册? – ionalchemist

回答

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') 

蟒蛇说,” ...对象有没有属性......“。

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