"exception: access violation writing" Python 中的错误 (ctypes)
"exception: access violation writing" error in Python (ctypes)
我已经学习 python (2.7) 几个星期了,以便能够自动化 autocad,所以,请耐心等待,我是 python 菜鸟。
我正在尝试获取新创建的块的属性来修改它们,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
方法必须 return 一个数组,所以我的问题是双重的:
在 python 中使用 .getAttributes
和 .getAttributes()
是同一回事吗? 菜鸟问题
- 为什么 Python 中使用的 ActiveX 方法没有给出与 VBA 中相同的结果(数组)?
编辑
从 here 我了解到 Python 可能是:
performing illegal operations (the kind of operations that if went
unchecked would probably crash your system).
根据文档,returned 数组的种类是:
Type: Variant (array of AttributeReference objects)
所以,也许是因为它不是一个简单的数组,而是一个 returned 的对象数组,有人知道如何规避这个吗?
我找到了解决方案 here:
你必须取消注释两行,对我来说它是 Python27\Lib\site-packages\comtypes\automation.py 中的 862 和 863 然后它与 getAttributes()
一起使用
我已经学习 python (2.7) 几个星期了,以便能够自动化 autocad,所以,请耐心等待,我是 python 菜鸟。
我正在尝试获取新创建的块的属性来修改它们,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
方法必须 return 一个数组,所以我的问题是双重的:
在 python 中使用菜鸟问题.getAttributes
和.getAttributes()
是同一回事吗?- 为什么 Python 中使用的 ActiveX 方法没有给出与 VBA 中相同的结果(数组)?
编辑 从 here 我了解到 Python 可能是:
performing illegal operations (the kind of operations that if went unchecked would probably crash your system).
根据文档,returned 数组的种类是:
Type: Variant (array of AttributeReference objects)
所以,也许是因为它不是一个简单的数组,而是一个 returned 的对象数组,有人知道如何规避这个吗?
我找到了解决方案 here:
你必须取消注释两行,对我来说它是 Python27\Lib\site-packages\comtypes\automation.py 中的 862 和 863 然后它与 getAttributes()