python c扩展模块中没有返回值的方法

mar*_*kmb 9 c python python-c-api parallel-port python-extensions

我正在尝试在python中创建一个通过并行端口发送数据的脚本.我正在用C语言创建自己的模块.

问题是:当我尝试执行我的模块时,python崩溃了.没有错误,没有数据,没有.它只是关闭.

这是我的模块:

#include <Python.h>
#include <sys/io.h>
#define BaseAddr 0x378

/*----------------------------------------------------------------------------------
Este es un módulo destinado a controlar el puerto paralelo.
Probablemente tenga que ser ejecutado como administrador.

Created by markmb
------------------------------------------------------------------------------------*/

static PyObject *
paralelo(PyObject *self, PyObject *args){
    int pin;
    ioperm(BaseAddr,3,1);
    if (!PyArg_ParseTuple(args, "i", &pin))
        return NULL;
    outb(pin,BaseAddr);
    ioperm(BaseAddr,3,0);
    return 1
}
PyMethodDef methods[] = {
    {"paralelo", paralelo, METH_VARARGS, "Sends data through a parallel port"},
    {NULL, NULL, 0, NULL}
};
PyMODINIT_FUNC
initparalelo(void){
    (void) Py_InitModule("paralelo", methods);
}
Run Code Online (Sandbox Code Playgroud)

(它没有所有python混乱的工作)我通过distutils编译它然后,在终端(使用xubuntu),我把:

import paralelo
while True:
    paralelo.paralelo(255)
Run Code Online (Sandbox Code Playgroud)

在这里,它脱离了python,它放了"markmb @ ..."

提前致谢!

And*_*org 17

所有python函数都应该返回一个PyObject,除非他们想要引发异常,如下所述:这里http://docs.python.org/extending/extending.html#intermezzo-errors-and-exceptions

您收到的错误消息SystemError: error return without exception set是试图告诉您函数返回NULL(=错误,引发异常),但没有通知python解释器您要引发的异常.

当你不想从python函数返回一个值时,你会让它返回None(如果你在python代码中有一个运行到最后的函数或者没有任何值的简单返回,就会发生同样的事情).

在cpython api中,您可以通过返回Py_None对象来执行此操作,并且不要忘记增加其引用计数.为了帮助您不忘记引用计数,有一个宏可以为您执行此操作:http://docs.python.org/c-api/none.html#Py_RETURN_NONE.

所以函数框架的函数返回什么(=返回None)你看起来像这样:

static PyObject *
myfunction(PyObject *self, PyObject *args){
    if (!PyArg_ParseTuple(args, "i", ...))
        return NULL;
    /* .... */
    Py_RETURN_NONE;
}
Run Code Online (Sandbox Code Playgroud)

最后,为了记录:有一个用于执行ioperm/outb调用的python模块:http://pypi.python.org/pypi/portio


Win*_*ert 11

将NULL返回到python/c API表示发生了错误.但由于您实际上没有设置异常,因此会收到错误:

SystemError:没有异常设置的错误返回

如果您尝试返回None,请使用:

return Py_BuildValue("");
Run Code Online (Sandbox Code Playgroud)

  • @markmb,小心!如果使用 return Py_None,则需要增加引用计数,否则会遇到麻烦。您应该使用我所拥有的,或者其他答案拥有的 Py_RETURN_NONE 或调用 Py_IncRef(Py_None) (4认同)