c/cpp使用Cython来调用python代码

python本身由c语言实现,所以理论上来说python代码是能够转换为c代码的。这里可以使用Cython来完成这一工作,相比较与python2.7官方提供的方法,Cython的方式更强大,更方便。
1.python2.7官方提供的方法来实现
main.c

#include "Python.h"

int main(int argc, char **argv)
{
	Py_Initialize();
	Py_SimpleString("print('hello world')");
	Py_Finalize();

	return 0;
}

这时候使用

gcc main.c -I/usr/include/python2.7 -lpython2.7命令进行编译
./a.out

则会输出hello world
但总体上来说这种方式比较麻烦,比较好的方式是使用Cython来实现C语言调用python代码。

2.使用Cython
首先写一个dict.pyx文件

stu_dict.pyx文件如下:

stu_dict.pyx文件如下:
stus = dict()

cdef public stu_add(name, score):
	stus[name] = score

cdef public stu_del(name):
	if name in stus:
		stus.pop(name)

cdef public stu_get(name):
	return stus.get(name, -1)

执行cython stu_dict.pyx会生成stu_dict.h 和 stu_dict.c两个文件。
然后写main.c文件如下:

#include "Python.h"
#include "stdio.h"

int main()
{
	Py_Initialize();
#if PY_MAJOR_VERSION < 3
	initstu_dict();
#else
	PyInit_stu_dict();
#endif

	stu_add(PyString_FromString("Lisi"), PyInt_FromLong(100));
	/*else function can call normaly*/
	Py_Inialize();
	return 0;
}

gcc main.c stu_dict.c -I/usr/include/python2.7 -lpython2.7
这种方式通过Cython完成python到C的转换,但由于C类型与python类型需要通过API来进行转换,所以其实这种写法很不方便,实际上,cython支持大量c类型,所以修改stud_dict.pyx和main.c,是的main.c中可以使用纯c类型的数据类型而且无需进行转换,修改方法很简单,比如支持const char *类型的数据类型,可以在stu_dict.pyx中函数声明时参数改为const char *,那在c中就无需进行转换。

本文遵从CC3.0协议转载请注明:转自凌风技术站

本文标题:c/cpp使用Cython来调用python代码

本文链接地址:http://www.iaccepted.net/python/knowledge-tree/144.html

相关文章



发表评论

电子邮件地址不会被公开。 必填项已用*标注