使用来自C++的任意数量的参数(在编译时未知)调用 Python 函数
Calling Python function with arbitrary number (not known at compilation time) of parameters from C++
我需要从C++调用表单的 Python 函数
def function(a, b, *c)
print(a) # Mock example
print(b) # Mock example
print(c) # Mock example
要求:我不应该修改 Python 函数。它们由用户提供,并且应具有该签名以保持一致性。
Python.h
界面提供(引用自链接,不要让你不得不打开另一个页面):
PyObject* PyObject_CallFunction(PyObject *callable, const char *format, ...)
返回值:新引用。 调用可调用的 Python 对象,具有可变数量的 C 参数。C 参数使用 Py_BuildValue() 样式格式字符串进行描述。格式可以为 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
的输入 我将其作为名为ca
的PyObject *
,同样cb
用于b
,并且一个名为cfunction
的PyObject *
包含对function
的引用。
如何拨打此电话?
我试过:
PyObject_CallFunctionObjArgs(cfunction, ca, cb, cc)
并且与传递format
字符串的其他方法类似。但这似乎导致了 Python 中形式的调用function(a, b, (c,))
.在 Python 代码中,c
,不是我在cc
中拥有的值的元组,而是一个 1 元素元组,第一个条目是我在cc
中拥有的元素元组。我还尝试创建一个新的
PyObject *
cd
,特别是一个包含ca
和cb
内容作为前两个元素的PyTupleObject
,其余元素是cc
元素。然后我打了一个像PyObject_CallFunctionObjArgs(cfunction, cd)
一样的电话.但这次Python抱怨function
需要位置参数b
。我假设是因为cd
中的元组完全给了a
.
以下方法有效:
PyObject_CallFunctionObjArgs(cfunction, ca, cb, cc, NULL)
它产生了相当于 Python 中的调用
function(a,b,*c)
你快到了:将你的cd
元组传递给PyObject_CallObject
。
- 使用 make 编译 MPI,几个命名空间错误,例如"错误:未知类型名称'使用'?
- 编译 Boost 时在 OS X 上的"ld:未知选项:-soname"
- 如何定义在编译时数据未知的 const 数组
- Cuda C++设计:编译时大小未知的可重用类
- GCC 编译时出现警告:未知转义序列:"\040"
- 使用来自C++的任意数量的参数(在编译时未知)调用 Python 函数
- 如何创建指向派生类的新指针,该派生类在C++编译时未知
- 未知 使用用于C++代码的标头编译 C 代码时char16_t未知类型名称
- 当Mac Mojave中的C 编译时,C编译器识别是未知的
- STXXL的任何STXXL替代方案都可以在编译时处理未知大小或任何技巧
- 如何在将我的 QT 应用程序交叉编译为 raspberry-pi3 时修复未知错误
- 无法编译任何C++程序;错误:未知类型名称'uint8_t'
- 为 freebsd 11 编译 gcc4.8.5 时出错: 错误: 未知类型名称 'choke'
- 在编译时初始化一个C++结构,就像一个未知绑定的数组
- 在编译时推导具有未知类型的函数重载
- 如何修复未知编译指示 gcc 警告
- 当编译时参数未知时,不调用"constexpr"构造函数
- 是否可以声明指向未知(编译时)返回类型的函数的指针
- 在 OSX 10.9.1 上使用 g++ 编译时出错:未知类型名称'__darwin_wctype_t'
- 如果两个维度在编译时都是未知的,如何传递二维数组