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 中检查了字节数组,foobarfoo.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 方法上失败的主要内容,如果未能解决你的问题,请参考以下文章

byte转bit

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