折腾了很久,终于找到可行的例子demo分3部分,1, c module文件,需要为python项目单独建立#include#include#define min(a,b) (((a) < (b)) ? (a) : (b))
char data[1024];
void SetData(const char *str)
{
printf("hello:%s\n",str);
strncpy(data, str, min(strlen(str) + 1, 1024));
}
const char *GetData()
{
return data;
}
PyDoc_STRVAR(PySetData_doc__, "\
测试\n\
\n\
PySetData(str)\n\
str: 出入的字符串\n\
返回: \n\
null \n\
");
static PyObject* PySetData(PyObject *self, PyObject *args)
{
const char* str = NULL;
if ( !PyArg_ParseTuple(args, "s", &str) )
{
return 0;
}
SetData(str);
Py_RETURN_NONE;
}
PyDoc_STRVAR(PyGetData_doc__, "\
打印数据\n\
\n\
PyGetData()\n\
返回: \n\
data \n\
");
static PyObject* PyGetData(PyObject *self, PyObject *args)
{
const char* str = NULL;
return PyString_FromString(GetData());
}
static PyMethodDef module_methods[] = {
{"py_set_data", PySetData, METH_VARARGS, PySetData_doc__},
{"py_get_data", PyGetData, METH_VARARGS, PyGetData_doc__},
{NULL}
};
PyMODINIT_FUNC initpycallc()
{
PyObject *module = Py_InitModule3("pycallc", module_methods,
"python call c");
}
2, 编译以上c,可直接命令行用gcc 。。。等,也可用python 工具来编译
建一个setup.py文件,内容如下
from distutils.core import setup, Extension
module1 = Extension('pycallc',
sources = ['pycallc.c'])
setup (name = 'pycallc',
version = '1.0',
description = 'This is a demo package',
ext_modules = [module1])
然后命令行执行
python setup.py build
会生成pycallc.so文件, 拷贝该文件到py的demo同目录 (也可其它目录,现在简单点)
3, python的demo
import pycallc
print "kkkk"
def test():
print 'in python : ', pycallc.py_get_data()
pycallc.py_set_data("change hello world!")
print pycallc.py_get_data()
if __name__ == "__main__" :
test()
可能在py文件中import pycallc一直显示红色,让我以为一直是错误的,事实目前这样就ok。