gpt4 book ai didi

python - 从 C++ 调用带有任意数量(编译时未知)参数的 Python 函数

转载 作者:太空宇宙 更新时间:2023-11-04 12:34:18 25 4
gpt4 key购买 nike

我需要从 C++ 调用表单的 Python 函数

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

要求:我不应该修改 Python 函数。它们由用户提供,并应具有该签名以保持一致性。

Python.h 接口(interface) provides (引用链接不会让您必须打开另一个页面):

  1. PyObject* PyObject_CallFunction(PyObject *callable, const char *format, ...)返回值:新引用。使用可变数量的 C 参数调用可调用的 Python 对象 callable。 C 参数使用 Py_BuildValue() 样式格式字符串进行描述。格式可以为 NULL,表示不提供任何参数。成功返回调用结果,或引发异常并在失败时返回 NULL。这相当于 Python 表达式:callable(*args)。请注意,如果您只传递 PyObject * args,PyObject_CallFunctionObjArgs() 是一个更快的替代方法。

  2. PyObject* PyObject_CallFunctionObjArgs(PyObject *callable, ..., NULL)返回值:新引用。使用可变数量的 PyObject* 参数调用可调用的 Python 对象 callable。参数以可变数量的参数形式提供,后跟 NULL。成功返回调用结果,或引发异常并在失败时返回 NULL。这相当于 Python 表达式:callable(arg1, arg2, ...)

作为 c 的一部分传递的参数数量在编译时是未知的。在运行时,我将它们作为指向元组的 PyObject *(我们称之为 cc)。假设 a 的输入我将它作为 PyObject * 称为 ca,同样 cb 用于 b 和一个名为 cfunctionPyObject * 包含对 function 的引用。

我该如何调用这个电话?

我试过:

  1. PyObject_CallFunctionObjArgs(cfunction, ca, cb, cc) 与传递 format 字符串的其他方法类似。但这似乎导致了在 Python 中调用 function(a, b, (c,)) 形式的调用。在 Python 代码中,c 不是我在 cc 中的值的元组,而是一个单元素元组,第一个条目是我输入的元素的元组已在 cc 中。

  2. 我还尝试创建一个新的 PyObject * cd,特别是 PyTupleObject 包含作为前两个元素的 >cacb 以及剩余的元素是cc 的元素。然后我调用了 PyObject_CallFunctionObjArgs(cfunction, cd)。但是这次 Python 提示 function 需要位置参数 b。我假设是因为 cd 中的元组已完全提供给 a

最佳答案

您快完成了:将您的 cd 元组传递给 PyObject_CallObject

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com