如何从C API调用方法,其中参数的数量仅在运行时已知?

时间:2018-02-02 13:11:27

标签: python

我正在使用Python C API来调用方法。目前我正在使用PyObject_CallMethodObjArgs来执行此操作。这是一个可变函数:

PyObject* PyObject_CallMethodObjArgs(PyObject *o, PyObject *name, ..., NULL)

当在编译时知道参数的数量时,这是绝对正常的。但是,我有一个场景,其中参数的数量直到运行时才知道,它们作为数组提供。

从本质上讲,我的问题与此问题完全相同:How can I pass an array as parameters to a vararg function?

那里接受的答案告诉我,我的问题没有解决办法。

这个障碍是否有办法解决?如果我无法使用PyObject_CallMethodObjArgs解决问题,那么Python C API中是否有可以满足我需求的替代函数?

例如,PyObject_Call接受参数作为Python序列对象。是否可以使用此功能,或具有类似界面的功能?

2 个答案:

答案 0 :(得分:4)

我不确定我是否完全错了,但AFAICT应该可以

答案 1 :(得分:0)

可能的方法是使用libffi,也许通过ctypes Python库。它知道你的ABIcalling conventions(因此在汇编程序中部分编码,对于许多流行的实现而言)并且使你能够调用任意签名和任意arity的任意函数。

请注意,便携式和标准no purely standard way of doing that中有C11(不使用某些外部库,但libffi ...)(请参阅n1570)。< / p>

BTW,libffi可以在任何C程序中使用。并且ctypes可以在任何Python程序中使用。

Python Embedding and extending Python章节解释了如何从C调用Python,或者从Python调用C语言。