Python中的“异常:访问冲突写入”错误(ctypes)

时间:2015-02-20 20:13:16

标签: python activex autocad comtypes

我已经学习python(2.7)几个星期才能自动进行autocad,所以,请耐心等待我的python noob。

我试图获取一个新创建的块的属性来修改它们,doc说在VBA中它会是:

Set blockRefObj = ThisDrawing.ModelSpace.InsertBlock(insertionPnt, "TESTBLOCK", 1#, 1#, 1#, 0)
varAttributes = blockRefObj.GetAttributes
For I = LBound(varAttributes) To UBound(varAttributes)
    strAttributes = strAttributes & vbLf & "  Tag: " & varAttributes(I).TagString & _
        vbLf & "  Value: " & varAttributes(I).TextString & vbLf & "    "

我已经将几个VBA代码片段翻译成Python代码并且每次都有效,但对于这个,我尝试了:

acad = comtypes.client.GetActiveObject("AutoCAD.Application")
doc = acad.ActiveDocument
ms = doc.ModelSpace
myBlock = ms.InsertBlock(array.array('d', [0, 0, 0]), 'TESTBLOCK', 1, 1, 1, 0)
varAttributes = myBlock.getAttributes()
for i in varAttributes:
    print i

但是我收到以下错误:

Traceback (most recent call last):
  File "C:/Ab******/test3/abtro2.py", line 84, in <module>
    add_PB(pt[0], pt[1], PB, int(ELR), PB_type, type_PEO, int(sorties), PB_addr[float(re.sub('PB', '', PB))])
  File "C:/Ab******/test3/abtro2.py", line 33, in add_PB
    varAttributes = myPB_Block.getAttributes()
  File "C:\Python27\lib\site-packages\comtypes\automation.py", line 506, in __ctypes_from_outparam__
    result = self.value
  File "C:\Python27\lib\site-packages\comtypes\automation.py", line 457, in _get_value
    typ = _vartype_to_ctype[self.vt & ~VT_ARRAY]
KeyError: 9
Exception WindowsError: 'exception: access violation writing 0x005608A4' in  ignored

根据我从VBA片段中读到的内容,getAttributes方法必须返回一个数组,所以我的问题有两个:

  1. 在python中使用.getAttributes.getAttributes()是一样的吗? noob question
  2. 为什么Python中使用的ActiveX方法没有提供与VBA相同的结果(数组)?
  3. 修改here我明白,也许Python是:

      

    执行非法操作(如果进行的那种操作   未经检查可能会使您的系统崩溃。)

    从doc中,返回的数组类型为:

      

    类型:Variant(AttributeReference对象数组)

    所以,也许它是因为它不是一个简单的数组,而是一个返回的对象数组,是否有人知道如何规避这个?

1 个答案:

答案 0 :(得分:1)

我找到了解决方案here

你必须取消注释两行,对我来说,它是Python27 \ Lib \ site-packages \ comtypes \ automation.py中的862和863然后它适用于getAttributes()