【问题标题】:Python ctypes how does one skip optional argumentsPython ctypes如何跳过可选参数
【发布时间】:2017-12-15 15:57:34
【问题描述】:

我有一个函数在我包装的标题中

IMPORT_FUNCTION int WINAPI GetStuff(int id, StuffStruct* stuff, StuffList *stuffList=NULL);

我用

包装了这个函数
mydll.GetStuff.argtypes = [c_int, POINTER(StuffStruct), POINTER(StuffList)]

也试过跳过

mydll.GetStuff.argtypes = [c_int, POINTER(StuffStruct)]

我需要在不指定最后一个参数的情况下调用此函数。我试过 None 并创建一个像这样 POINTER(StuffList)() 的空指针 我觉得我应该使用原型,但我现在不知道。

stuff = StuffStruct()
np = POINTER(StuffList)()
mydll.GetStuff(2, byref(stuff), None) # tried this 
mydll.GetStuff(2, byref(stuff), np) # tried this 
mydll.GetStuff(2, byref(stuff)) # tried this

【问题讨论】:

  • mydll.GetStuff(2, byref(stuff), byref(None)) 怎么样
  • 这个原型在我看来就像 C++。 C 不支持具有默认值的可选参数。在 C 语言中,如果 NULL,您可以有一个将被忽略的指针参数,在这种情况下,通过 ctypes 将其作为 None 传递。但如果这真的是一个没有明确定义的 C API 的 C++ 库,那么最好使用 cython 或 CFFI。
  • @eryksun 你说得对,它是 C++ lib,但我想除了这一刻之外,还有定义明确的 C API。这个默认值适用于整数,因为我可以很好地传递 0。但NULL指针不是。

标签: python c wrapper ctypes


【解决方案1】:

试试:

mydll.GetStuff(2, byref(stuff), byref(0))

mydll.GetStuff(2, byref(stuff), byref(None))

np = POINTER([])

【讨论】:

    【解决方案2】:

    None 相当于 Python 中的 NULL。为所有三个参数声明argtypes。以下是正确的:

    mydll.GetStuff.argtypes = [c_int, POINTER(StuffStruct), POINTER(StuffList)]    
    
    stuff = StuffStruct()
    mydll.GetStuff(2, byref(stuff), None)
    

    ctypes 不知道可选参数,所以你必须传递一些东西。您总是可以将 ctypes 调用包装在 Python 函数中,然后调用它:

    def GetStuff(id,stuff,stuffList=None):
        mydll.GetStuff(id,stuff,stuffList)
    

    【讨论】:

      猜你喜欢
      • 2011-06-05
      • 2016-01-28
      • 1970-01-01
      • 2017-04-08
      • 2010-11-07
      • 2020-12-24
      • 2013-01-04
      相关资源
      最近更新 更多