使用C或C++扩展python

在python中,如果需要实现一些新的函数,类型对象及方法,可以通过C/C++实现新的模块实现。

一个简单的例子

如果要实现一个module叫spam,希望实现一个方法函数system,调用的是C的库函数system()

import spam
status = spam.system("ls -l")

首先创建一个C文件spammodule.c ,该文件包含这个模块的C实现代码,首先第一行:

#include <Python.h>

该头文件包含大部分python run-time的函数,宏定义和变量。该头文件必须第一个包含

后面需要实现spam.system的具体实现代码

static PyObject *
spam_system(PyObject *self, PyObject *args)
{
    const char *command;
    int sts;

    if (!PyArg_ParseTuple(args, "s", &command))
        return NULL;
    sts = system(command);
    return PyLong_FromLong(sts);
}

self指向一个当前的对象实体,args是一个python元组的指针。

PyArg_ParseTuple()检查参数类型并将其从python的类型转为C代码的值。

PyLong_FromLong将整数返回为python的整数对象。

在实现该方法的函数后,需要制定这个模块的方法表和初始化函数

static PyMethodDef SpamMethods[] = {
    ...
    {"system",  spam_system, METH_VARARGS,
     "Execute a shell command."},
    ...
    {NULL, NULL, 0, NULL}        /* Sentinel */
};
static struct PyModuleDef spammodule = {
    PyModuleDef_HEAD_INIT,
    "spam",   /* name of module */
    spam_doc, /* module documentation, may be NULL */
    -1,       /* size of per-interpreter state of the module,
                 or -1 if the module keeps state in global variables. */
    SpamMethods
};
这个模块必须在初始化函数中进行创建。初始化函数必须以PyInit_name()命名。
PyMODINIT_FUNC
PyInit_spam(void)
{
    return PyModule_Create(&spammodule);
}

完成上述步骤后,如果是作为一个永久的模块,只需要将本文件放入到Modules/目录下,在Modules/Setup.local添加下行

spam spammoudle.o



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值