1

我是python的新手,我正在尝试使用在C上编写的模块启动python脚本。当我尝试启动python脚本时出现分段错误(核心转储)错误。这是一个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)

有人可以看看并指出我正确的方向,我做错了什么。提前致谢。

4

2 回答 2

3

NULL在不设置异常或确保已由您调用的函数设置的情况下返回是否合法?我认为这NULL是一个信号,表明 Python 可以为用户寻找异常。

我不确定这Py_INCREF(pyfd);是必要的;对象在创建时不是已经有 1 的引用计数吗?

于 2013-04-05T11:29:31.997 回答
0

您的函数接收参数元组。您需要从元组中提取整数:

static PyObject* input_device_open(PyObject* self, PyObject* args)
{
    int fd, nr;
    PyObject* pyfd;

    if (!PyArg_ParseTuple(args, "i", &nr))
        return NULL;
于 2013-04-05T13:01:23.587 回答