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 中检查了字节数组,foo
和 bar
,foo.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);
在下面的代码中,我使用 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 中检查了字节数组,foo
和 bar
,foo.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);