【问题标题】:Python. How to call a function that expect ctypes array. Strand/Straus7Python。如何调用需要 ctypes 数组的函数。斯特兰德/斯特劳斯7
【发布时间】:2018-04-17 16:03:02
【问题描述】:

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

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

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

这里是 .py 脚本https://www.dropbox.com/s/88plz2funjqy1vb/St7API.py?dl=0

如手册开头所述,我必须将列表转换为 ctypes 数组 (Img.4)。 我调用的函数与示例相同,但我无法正确调用它。 我写

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

我尝试了很多解决方案,但没有一个有效。

谁能帮帮我?

非常感谢

【问题讨论】:

  • 如果可能,最好 (a) 链接到实际手册而不是其屏幕截图,并且 (b) 将相关文本复制并粘贴到问题中,这样链接在第一名。有时这是不可能的(例如,很难链接到印刷书籍),如果图表不是文本,则无法将其复制并粘贴为没有可怕的 ASCII 艺术的文本),但如果可能的话,请编辑您的问题。
  • 无论如何,你做事的方式调用一个需要ctypes数组的函数的方式,你得到的错误消息说函数需要一个ctypes 数组。可能库中存在错误,或者文档中存在错误,或者您将旧文档用于新版本库的不匹配,反之亦然。
  • 感谢您的建议,这是我第一次在这里问问题,我是一个非常初学者。
  • 也感谢您的回答。实际上,当我放入其他内容时,错误消息会发生变化。例如,如果我写 SA.St7SetUnits(1, units[0]) 返回预期的 LP_c_long, got int
  • LP_c_long 意味着它需要一个指向 int 的指针,所以 int 肯定行不通。一个整数数组应该像在 C 中一样自动“衰减”到指向该数组的指针,但如果这不起作用,您可以显式传递一个指向该数组的指针,可能通过使用 byref 或 @ 987654334@ 函数来自ctypes。你不应该这样做,但是如果库作者在设置 argtypes 时做了一些奇怪的事情,也许这就是问题所在,所以试试看会发生什么。

标签: python arrays ctypes


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    PI = ctypes.POINTER(ctypes.c_long)
    

    每当您将数组从 IronPython 传递到 St7API 时,都要这样做:

    SA.St7SetUnits(1, PI(units))
    

    This answer 稍微多一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-12
      • 2013-08-14
      • 2020-06-08
      • 2017-06-27
      • 1970-01-01
      • 2020-07-31
      • 1970-01-01
      • 2017-07-22
      相关资源
      最近更新 更多