2011-12-09 13 views
6

私は、パラレルポート経由でデータを送信するスクリプトをPythonで作成しようとしています。私は自分のモジュールをC言語で作成しています。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の混乱せずに動作します) 私は(Xubuntuのを使用して)、端末で、その後のdistutilsを通してそれをコンパイルして、私が入れ:

import paralelo 
while True: 
    paralelo.paralelo(255) 

をそして、ここでは、pythonから出て、 "markmb @ ..."を入れます。

ありがとうございます!

+0

CでPythonモジュールを作成していませんが、PyObject *を返すはずの関数paraleloでは、なぜ1を返していますか? – lloydm

+0

本当に何も返すべきではありませんが、別のモジュールをやり直す場合は、覚えておきます。 – markmb

+0

代わりにNULLを返すのはどうですか? 1よりもむしろ無効なポインタです。 – lloydm

答えて

10

Python/c APIにNULLを戻すと、エラーが発生したことが示されます。

あなたはNoneを返すしようとしている場合

SystemError: error return without exception set

、使用:あなたが実際に例外を設定していなかったので、しかし、あなたがエラーを取得

return Py_BuildValue(""); 
+0

私は他のコメントが言ったものを使いました:Py_Noneを返して、それは動作します – markmb

+1

@markmb、注意! return Py_Noneを使用する場合は、参照カウントをインクリメントする必要があります。そうしないと、問題が発生します。私が持っているものを使うか、他の答えが持っているPy_RETURN_NONEかPy_IncRef(Py_None) –

13

全てのPythonの関数は、PyObjectを返す必要がありますをする場合でない限り、彼らあなたの関数がNULL(=エラー、例外を発生させます)を返しましたが、Pythonインタプリタに何の例外を通知しなかったかを伝えようとしています。欲しいです育てる

Python関数から値を返さない場合は、Noneを返すようにします(これは、Pythonコードで最後まで実行される関数がある場合や、値)。

cpythonのapiでは、Py_Noneオブジェクトを返すことでこれを行い、refcountを増やすことを忘れないでください。 refcountを忘れないようにするには、http://docs.python.org/c-api/none.html#Py_RETURN_NONEというマクロがあります。

だから返す関数何のための機能スケルトン(=返却なし)あなたはこのようなものを見て:

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

最後に、記録のために:はiopermを行うためのPythonモジュールがある/ OUTBがすでに呼び出し、 :http://pypi.python.org/pypi/portio

関連する問題