PyObject_CallObject bytearray 方法失败

PyObject_CallObject failing on bytearray method

在下面的代码中,我使用 Python C API 创建了一个指向 PyObject 的指针,代表一个字节数组。然后我从 bytearray 中提取方法 "endswith" 并尝试在原始 bytearray 本身上调用它,期望它 return Py_True. 然而,它 returns NULL 并且程序打印 "very sad".

#include<Python.h>
#include<iostream>
int main()
{
    Py_Initialize();
    //make a one-byte byte array
    PyObject* oneByteArray = PyByteArray_FromStringAndSize("a", 1);
    //get the method "endswith" from the object at oneByteArray
    PyObject* arrayEndsWith = PyObject_GetAttrString(oneByteArray, "endswith");
    //ask python if "a" ends with "a"
    PyObject* shouldbetrue = PyObject_CallObject(arrayEndsWith, oneByteArray);

    if (shouldbetrue == Py_True) std::cout << "happy\n";
    if(shouldbetrue == NULL)std::cout << "very sad\n";

    Py_Finalize();
    return 0;
}

我在 Python 中检查了字节数组,foobarfoo.endswith(bar) return 是一个布尔值。我还在上面的代码中添加了 PyCallable_Check(arrayEndsWith) 并验证了该对象是可调用的。我的错误是什么?

如果您添加 PyErr_PrintEx(1) 这行,它会告诉您:

TypeError: argument list must be a tuple

the documentation for PyObject_CallObject证实了这一点:

Call a callable Python object callable_object, with arguments given by the tuple args.

有一大堆从 C-api 调用函数的方法。我选择了一个不需要元组的,它对我有用(但选择你喜欢的那个):

PyObject* shouldbetrue = PyObject_CallFunctionObjArgs(arrayEndsWith, oneByteArray,NULL);