• 通过C来扩展Python


    Python是一门通过C语言写出来的动态语言。那么可以通过C语言对Python3的库进行扩展。

    主要的流程是通过C语言实现一些方法和功能,然后使用Python.h的文件功能,将C语言实现的功能进行包装,通过gcc编译城*.so的库文件。然后在python的代码中import编译成功的库,就可以调用库里面的方法了。

    下面是C的代码:

    首先,通过c语言定义几个函数fact(), zero()和add()。然后对这几个函数进行包装,在本文例子中是通过wrap_fact(),wrap_zero()和wrap_add()将三个函数包装。文件存为main.c(名字可以随便定义为*.c)

    复制代码
    #include <Python.h>
    
    int fact(int n)
    {
      if (n <= 1)
        return 1;
      else
        return n * fact(n - 1);
    }
    
    void zero()
    {
        int result = 0;
    }    
    
    int add(int a, int b)
    {
        return a+b;
    }
    
    PyObject* wrap_fact(PyObject* self, PyObject* args)
    {
      int n, result;
    
      if (! PyArg_ParseTuple(args, "i", &n))
        return NULL;
      result = fact(n);
      return Py_BuildValue("i", result);
    }
    
    PyObject* wrap_zero(PyObject* self, PyObject* args)
    {
        if(!PyArg_ParseTuple(args, ""))
            return Py_BuildValue("", NULL);
        zero();
        return Py_BuildValue("", NULL);
            
    }
    
    PyObject* wrap_add(PyObject* self, PyObject* args)
    {
        int a, b;
        if (!PyArg_ParseTuple(args, "ii", &a, &b))
           return Py_BuildValue("i", 0);
        int result = add(a, b);
        return Py_BuildValue("i", result);
    }
    static PyMethodDef exampleMethods[] =
    {
      {"fact", wrap_fact, METH_VARARGS, "Caculate N!"},
      {"zero", wrap_zero, METH_VARARGS, ""},
      {"add", wrap_add, METH_VARARGS, ""},
      {NULL, NULL}
    };
    
    void initexample()
    {
      PyObject* m;
      m = Py_InitModule("example", exampleMethods);
    }
    复制代码

    接着,通过gcc -fPIC -o example.so -shared -I/usr/include/python2.7 main.c 将文件编译为example.so的库

    接下来,通过在python中导入原来的库就可以将原来文件进行调用了。

    import example
    
    print example.fact(4)
    example.zero()
    print example.add(3,4)
  • 相关阅读:
    根据自己的博客数据统计国内IT人群
    使用dropwizard(5)--加入swagger
    使用dropwizard(4)-加入测试-jacoco代码覆盖率
    使用dropwizard(3)-加入DI-dagger2
    收藏博客
    IntelliJ IDEA 下载安装(含注册码)
    fontawesome图标字体库组件在服务器上显示不出来图标的解决
    MySQL DBA工作角色和职责介绍
    MySQL主主复制(双主复制)配置过程介绍
    MySQL表与表之间的SQL Joins图介绍
  • 原文地址:https://www.cnblogs.com/SevenwindMa/p/4840814.html
Copyright © 2020-2023  润新知