gpt4 book ai didi

Python/C API - 不显示结果

转载 作者:太空宇宙 更新时间:2023-11-04 03:23:34 27 4
gpt4 key购买 nike

我想在 Python 中集成 C 模块,所以我的选择落在了接口(interface) Python.h 上。所有编译都没有错误和警告,所以我不明白问题是什么。

C 端:

#include <python3.5m/Python.h>
...
#define PyInt_AsLong(x) (PyLong_AsLong((x)))
typedef PyObject* Py;

static Py getSumma(Py self, Py args){
Py nums;
if (!PyArg_ParseTuple(args, "O", &nums)){
return NULL;
}
size_t numsAmount = PyList_Size(args);
int32_t summa = 0;

for (size_t i = 0; i < numsAmount; i++){
Py temp = PyList_GetItem(nums, i);
int32_t num = PyInt_AsLong(temp);
summa += num;
}
return Py_BuildValue("l", summa);
}

static PyMethodDef moduleMethods[] = {
{"getSumma", (PyCFunction)getSumma, METH_VARARGS, NULL},
{NULL, NULL, 0, NULL}
};

static PyModuleDef SummaLogic = {
PyModuleDef_HEAD_INIT,
"SummaLogic",
"",
-1,
moduleMethods
};

PyMODINIT_FUNC PyInit_SummaLogic(void){
return PyModule_Create(&SummaLogic);
}

设置.py:

from distutils.core import setup, Extension

SummaLogic = Extension("SummaLogic", sources=['SummaLogic.c'])
setup(ext_modules=[SummaLogic])

Python 方面:

from SummaLogic import getSumma

if __name__ == "__main__":
a = [1, 2, 3]
b = getSumma(a)
print(b)

这似乎是正确的,但是当我在终端中启动它时 - 没有任何反应,只是挂起而没有任何事件。我能错过什么?

最佳答案

归结为 PyList_Size并且您不检查那里的错误。

您可能想在 nums 上使用它,而不是 args 作为参数。但是,您使用了 args 并且发生了一件非常有趣的事情:

  • args 是一个tuple,
  • 因此 PyList_Size 失败并返回 -1
  • -1 被转换为无符号的 size_t,这可能会产生一个非常大的数字,可能是 2**64-1
  • 因此您的迭代运行“非常长的时间”,因为迭代 2**64-1 项目需要相当长的时间(除了所有越界内存访问)。

快速修复是使用:

Py_ssize_t listlength = PyList_Size(nums);  /* nums instead of args */
if (listlength == -1) { /* check for errors */
return NULL;
}
size_t numsAmount = (size_t)listlength /* cast to size_t only after you checked for errors */

但是,您应该在每次调用 python C API 函数后检查错误条件并测试它们,否则您会得到很多未定义的行为。此外,我可能会坚持使用定义的返回类型而不是 int32_t(PyInt_AsLong 返回 long,因此您也可能在那里遇到奇怪的转换错误!) , size_t, ... 和 typedef PyObject* Py; 让经常编写 C 扩展的人感到棘手。

关于Python/C API - 不显示结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43288221/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com