为什么要用C语言写Python模块,是Python不够香么?还是觉得头发还茂盛?都不是。因为C语言模块有几个显而易见的好处:
- 可以使用Python调用C标准库、系统调用等;
- 假设已经有了一堆C代码实现的功能,可以不用重写,岂不美滋滋;
- 性能?也算;
- 其他一些好处。
注:以下代码基于Python3。
开局举个栗
In a nutshell,用C编写Python模块就是下面几步:
准备工作
#include<Python.h>
// 没错,这就够了,什么stdio.h就都有了
定义API
static PyObject* say_hello(PyObject* self, PyObject* args) {
printf("Hello world, I just a demo.");
}
注册API
// PyMethodDef 是一个结构体
static PyMethodDef my_methods[] = {
{
"say", say_hello, 0, "Just show a greeting." },
{
NULL, NULL, 0, NULL}
};
注册模块
static struct PyModuleDef my_module = {
PyModuleDef_HEAD_INIT,
"dummy",
NULL,
-1,
my_methods
};
初始化
PyMODINIT_FUNC PyInit_mymodule(void) {
return PyModule_Create(&my_module);
}
编译
编译也可以手动编译,只不过,懒。。。
from distutils.core import setup, Extension
module1 = Extension('dummy',
define_macros = [('MAJOR_VERSION', '1'),
('MINOR_VERSION', '0')],
sources = ['my_module.c'])
setup (name = 'DummyModule',
version = '1.0',
description = 'This is a demo package',
author = 'zmyzhou'