蟒蛇。如何调用期望ctypes数组的函数。东街/ Straus7

时间:2018-04-17 16:03:02

标签: python arrays ctypes

我正在使用python脚本来为Strand / Straus7导入他的DLL。

我正在尝试按照手册(Img.1)调用一个函数来设置单位,称为St7SetUnits,并观察我导入的DLL的 .py 脚本({ {3}})。该函数需要 c_long ctypes.POINTER。(c_long),如脚本中指定的那样(Img.2

这里有完整的手册strand7.com/downloads/Strand7%20R246%20API%20Manual%20TOC.pdf

这里是 .py 脚本Img.3

如手册开头所述,我必须转换ctypes数组中的列表(https://www.dropbox.com/s/88plz2funjqy1vb/St7API.py?dl=0)。 我调用的函数与示例相同,但我无法正确调用它。 我写了

import St7API as SA
import ctypes 

SA.St7Init()

unitsArray = ctypes.c_int * SA.kLastUnit
units = unitsArray()
units[0] = 0
units[1] = 1
units[2] = 3
units[3] = 1
units[4] = 1
units[5] = 2
SA.St7SetUnits(1, units)

但是返回错误

expected c_long, got c_long_Array_6

如果我尝试其他的东西,例如数组中的int

SA.St7SetUnits(1, units[0])

中的错误更改
 expected LP_c_long, got int

我尝试了很多解决方案,但没有人工作。

任何人都可以帮助我吗?

非常感谢

2 个答案:

答案 0 :(得分:0)

我知道已经有一段时间了,但这对我有用:

units_type=ctypes.c_long*6
Units = units_type(0,1,3,1,1,2)
St7API.St7SetUnits(1,Units)

答案 1 :(得分:0)

从您的屏幕截图看来,您可能正在使用Grasshopper。如果是这样,您可能需要通过将以下行添加到脚本顶部来显式将unites数组强制转换为指针:

PI = ctypes.POINTER(ctypes.c_long)

每当您将数组从IronPython传递到St7API时,请执行以下操作:

SA.St7SetUnits(1, PI(units))

This answer的数量更多。