我需要从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 *
,即ca
的cb
,而b
的PyObject *
保留了对cfunction
的引用。我怎么打这个电话?
我努力了:
function
,并与传递PyObject_CallFunctionObjArgs(cfunction, ca, cb, cc)
字符串的其他方法类似。但这似乎导致在Python中调用format
形式。在Python代码内部,function(a, b, (c,))
而不是我在c
中具有的值的元组,而是一个1元素元组,第一个条目是我在cc
中具有的元素的元组。 cc
PyObject *
,特别是一个cd
,它包含PyTupleObject
和ca
的内容作为前两个元素,其余元素是cb
的元素。然后我打电话给cc
。但是这次Python抱怨PyObject_CallFunctionObjArgs(cfunction, cd)
需要位置参数function
。我认为是因为b
中的元组完全被赋予cd
。 最佳答案
您快到了:将cd
元组传递给PyObject_CallObject
。
关于python - 使用C++中的任意数量(编译时未知)的参数调用Python函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57101350/