我正在尝试在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);
}
(没有所有python乱七八糟的工作) 我通过distutils编译它然后,在终端(使用xubuntu),我把:
import paralelo
while True:
paralelo.paralelo(255)
在这里,它脱离了python,它放了“markmb @ ...”
提前致谢!
答案 0 :(得分: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;
}
最后,为了记录:有一个用于执行ioperm / outb调用的python模块:http://pypi.python.org/pypi/portio
答案 1 :(得分:11)
将NULL返回到python / c API表示发生了错误。但由于您实际上没有设置异常,因此会收到错误:
SystemError:错误返回,无异常设置
如果您尝试返回None,请使用:
return Py_BuildValue("");