我是python中的新手,我正在尝试使用在C上写入的模块启动python脚本。当我尝试启动python脚本时,我收到了Segmentation fault(core dumped)错误。 这是一个C代码:
// input_device.c
#include "Python.h"
#include "input.h"
static PyObject* input_device_open(PyObject* self, PyObject* id)
{
int fd, nr;
PyObject* pyfd;
if (!PyInt_Check(id))
return NULL;
nr = (int)PyInt_AsLong(id);
fd = device_open(nr, 0);
if (fd == -1)
return NULL;
pyfd = PyInt_FromLong(fd);
Py_INCREF(pyfd);
return pyfd;
}
static PyMethodDef module_methods[] =
{
{ "device_open", (PyCFunction)input_device_open, METH_VARARGS, "..." },
{ NULL, NULL, 0, NULL }
};
PyMODINIT_FUNC initinput_device(void)
{
Py_InitModule4("input_device", module_methods, "wrapper methods", 0, PYTHON_API_VERSION);
}
和python脚本:
from input_device import device_open
device_open(1)
有人可以看看并指出我正确的方向,我做错了什么。提前谢谢。
答案 0 :(得分:3)
在没有设置异常的情况下返回NULL
,或者确保已通过您调用的函数设置了一个异常,是否合法?我认为NULL
是一个信号,Python可以寻找为用户筹集的异常。
我不确定Py_INCREF(pyfd);
是否必要;该对象在创建时是否已具有1的引用计数?
答案 1 :(得分:0)
你的函数收到一个参数元组。您需要从元组中提取整数:
static PyObject* input_device_open(PyObject* self, PyObject* args)
{
int fd, nr;
PyObject* pyfd;
if (!PyArg_ParseTuple(args, "i", &nr))
return NULL;