我需要从C++调用以下形式的Python函数

def function(a, b, *c)
    print(a) # Mock example
    print(b) # Mock example
    print(c) # Mock example

要求:我不应该修改Python函数。它们由用户提供,并且应具有该签名以保持一致性。
Python.h接口(interface)provides(引用链接以使您不必打开其他页面):
  • PyObject* PyObject_CallFunction(PyObject *callable, const char *format, ...)返回值:新参考。
    调用可调用的Python对象,该对象具有可变数量的C参数。使用Py_BuildValue()样式格式字符串描述C参数。格式可以为NULL,表示未提供任何参数。
    成功时返回调用结果,或者引发异常,失败时返回NULL。
    这等效于Python表达式:callable(* args)。
    请注意,如果仅传递PyObject * args,则PyObject_CallFunctionObjArgs()是更快的选择。
  • PyObject* PyObject_CallFunctionObjArgs(PyObject *callable, ..., NULL)返回值:新参考。
    调用可调用的Python对象,该对象具有可变数量的PyObject *参数。提供的参数是可变数量的参数,后跟NULL。
    成功时返回调用结果,或者引发异常,失败时返回NULL。
    这等效于Python表达式:callable(arg1,arg2,...)

  • 在编译时未知作为c的一部分传递的参数的数量。在运行时,我将它们作为指向元组的PyObject *(我们称之为cc)。假设a的输入为PyObject *,即cacb,而bPyObject *保留了对cfunction的引用。

    我怎么打这个电话?

    我努力了:
  • function,并与传递PyObject_CallFunctionObjArgs(cfunction, ca, cb, cc)字符串的其他方法类似。但这似乎导致在Python中调用format形式。在Python代码内部,function(a, b, (c,))而不是我在c中具有的值的元组,而是一个1元素元组,第一个条目是我在cc中具有的元素的元组。
  • 我还尝试创建一个新的cc PyObject *,特别是一个cd,它包含PyTupleObjectca的内容作为前两个元素,其余元素是cb的元素。然后我打电话给cc。但是这次Python抱怨PyObject_CallFunctionObjArgs(cfunction, cd)需要位置参数function。我认为是因为b中的元组完全被赋予cd
  • 最佳答案

    您快到了:将cd元组传递给PyObject_CallObject

    关于python - 使用C++中的任意数量(编译时未知)的参数调用Python函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57101350/

    10-11 21:09