12

パラレル ポート経由でデータを送信するスクリプトを 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@...」と入力します。

前もって感謝します!

4

2 に答える 2

19

説明されているように、例外を発生させたい場合を除き、すべての python 関数はPyObjectを返す必要があります。

表示されるエラー メッセージSystemError: error return without exception setは、関数が NULL を返した (= エラー、例外を発生させた) ことを伝えようとしていますが、どの例外を発生させたいかを Python インタープリターに通知していませんでした。

Python 関数から値を返したくない場合は、None を返すようにします (これは、Python コードで最後まで実行する関数がある場合や、値なしで単純な戻り値を実行する場合と同じです)。

cpython API では、Py_None オブジェクトを返すことでこれを行います。その参照カウントをインクリメントすることを忘れないでください。refcount を忘れないようにするためのマクロがあります: 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

于 2011-12-09T20:02:37.040 に答える
13

python/c API に NULL を返すことは、エラーが発生したことを示します。しかし、実際には例外を設定していないため、次のエラーが発生します。

SystemError: 例外が設定されていないエラーが返されます

None を返そうとしている場合は、次を使用します。

return Py_BuildValue("");
于 2011-12-09T19:47:08.140 に答える