gpt4 book ai didi

python - PyArg_ParseTuple 导致段错误

转载 作者:行者123 更新时间:2023-11-30 16:04:24 25 4
gpt4 key购买 nike

我正在尝试从我的扩展中调用 c 函数,并将问题范围缩小到这个测试用例。

#import "Python.h"

...

// Called from python with test_method(0, 0, 'TEST')
static PyObject*
test_method(PyObject *args)
{
int ok, x, y, size;
const char *s;

// this causes Segmentation fault
//ok = PyArg_ParseTuple(args, "iis#", &x, &y, &s, &size);

// also segfaults
//if(ok) PyErr_SetString(PyExc_SystemError, 'Exception');

// this does not cause segfault but fills the variables with garbage
ok = PyArg_ParseTuple(&args, "iis#", &x, &y, &s, &size);

// Example: >test_method 0, 37567920, (garbage)
printf(">test_method %d, %d, %s\n", x, y, s);

/* Success */
Py_RETURN_NONE;
}

static PyMethodDef testMethods[] =
{
{"test_method", test_method, METH_VARARGS,
"test_method"},
...

{NULL, NULL, 0, NULL}
};

任何想法我可能做错了什么。 (Python 版本 2.6.4)。

最佳答案

嗯。我认为你的方法的签名应该是这样的:

static PyObject* test_method(PyObject* self, PyObject* args)

如果您调用 test_method作为绑定(bind)方法(即某个对象实例的方法),self将是对象本身。如果test_method是一个模块函数,self是传递给 Py_InitModule4() 的指针当您初始化模块时(如果您使用 Py_InitModule() 则为 NULL )。问题是 Python 在代码级别上不区分绑定(bind)实例方法和普通函数,这就是为什么你必须传递 self即使您正在实现一个简单的函数。

参见this page了解更多详情。

关于python - PyArg_ParseTuple 导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3147869/

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