从Python调用C函数
我使用了一个用
Python编写的服务器文件来构建我的Raspberry Pi和我的iPhone之间的连接.我写了一个简单的C程序,帮助翻译莫尔斯代码.我想从Python服务器程序中调用C程序中的translate()函数.
我在网上找到了一个教程并按照其说明编写了我的C程序并编辑了netio_server.py文件 在我的C程序morseCodeTrans.c中它就像 #include <Python.h> #include <stdio.h> static PyObject* py_translate(PyObject* self,PyObject* args) { char *letter; PyArg_ParseTuple(args,"s",&letter); if(strcmp(letter,".-") == 0) return Py_BuildValue("c",'A'); else if(strcmp(letter,"-...") == 0) return Py_BuildValue("c",'B'); ... } static PyMethodDef morseCodeTrans_methods[] = { {"translate",py_translate,METH_VARARGS},{NULL,NULL} }; void initmorseCodeTrans() { (void)Py_InitModule("morseCodeTrans",morseCodeTrans_methods); } 在服务器文件netio_server.py中它就像: # other imports import morseCodeTrans ... tempLetter = '' if line == 'short': tempLetter += '.' elif line == 'long': tempLetter += '-' elif line == 'shortPause': l = morseCodeTrans.translate(tempLetter) print "The letter is",l 以上是我称之为C translate()函数的唯一地方 然后我尝试编译morseCodeTrans.c文件,如下所示: gcc -shared -I/usr/include/python2.7/ -lpython2.7 -o myModule.so myModule.c 编译成功了. l = morseCodeTrans.translate(tempLetter) 服务器程序刚刚终止,没有任何错误消息. 我是Python编程的新手,所以我无法弄清楚问题出在哪里.有帮助吗? 解决方法
你刚刚在界面中得到了一些小混合.我按如下方式修改了代码以使其工作:
#include <Python.h> #include <stdio.h> static PyObject* py_translate(PyObject* self,PyObject* args) { char *letter; PyArg_ParseTuple(args,&letter); if(strcmp(letter,".-") == 0) return Py_BuildValue("c",'A'); else if(strcmp(letter,"-...") == 0) return Py_BuildValue("c",'B'); /* ... */ else Py_RETURN_NONE; } static PyMethodDef morseCodeTrans_methods[] = { {"translate",METH_VARARGS,""},{0} }; PyMODINIT_FUNC initmorseCodeTrans(void) { Py_InitModule("morseCodeTrans",morseCodeTrans_methods); } 使用distutils构建更加安全,因为它可以防止您意外链接到错误版本的Python.使用以下setup.py: from distutils.core import setup,Extension module = Extension('morseCodeTrans',sources=['morseCodeTrans.c']) setup(ext_modules=[module]) 只需使用python setup.py install即可. 编辑 尽管界面混乱,但看起来您的代码仍然有效.那么你的问题很可能是在链接过程中.如上所述,使用distutils应该可以解决这个问题.如果你绝对想手动构建,请使用python-config –cflags,python-config –ldflags等来确保链接到正确版本的Python. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |