PyObject_CallObject 在 bytearray 方法上失败
Posted
技术标签:
【中文标题】PyObject_CallObject 在 bytearray 方法上失败【英文标题】:PyObject_CallObject failing on bytearray method 【发布时间】:2016-10-06 15:57:51 【问题描述】:在下面的代码中,我使用 Python C API 创建了一个指向 PyObject 的指针,它表示一个字节数组。然后我从字节数组中提取方法“endswith”并尝试在原始字节数组本身上调用它,期望它返回Py_True.
但是,它返回NULL
并且程序打印“非常难过”。
#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)
返回一个布尔值。我还在上面的代码中添加了PyCallable_Check(arrayEndsWith)
,并验证了该对象是可调用的。我的错误是什么?
【问题讨论】:
【参考方案1】:如果您添加 PyErr_PrintEx(1)
行,它会告诉您:
TypeError:参数列表必须是元组
the documentation for PyObject_CallObject
证实了这一点:
调用一个可调用的 Python 对象 callable_object,参数为 元组参数。
从 C-api 调用函数的方法有很多种。我选择了一个不需要元组的,它对我有用(但选择你喜欢的那个):
PyObject* shouldbetrue = PyObject_CallFunctionObjArgs(arrayEndsWith, oneByteArray,NULL);
【讨论】:
PyObject_IsTrue(shouldbetrue)
也可能以上是关于PyObject_CallObject 在 bytearray 方法上失败的主要内容,如果未能解决你的问题,请参考以下文章
php get_timezone_byt_lat_long_inkplant.com.php
java 中 byte[]FileInputStream 互相转换
java 中 byte[]FileInputStream 互相转换
java 中 byte[]FileInputStream 互相转换
mysql error 1197 ,Multi-statement transaction required more than 'max_binlog_cache_size' byt