📜  Python扩展模块中的 C API |设置 2

📅  最后修改于: 2022-05-13 01:55:30.539000             🧑  作者: Mango

Python扩展模块中的 C API |设置 2

先决条件: Python扩展模块中的 C API |设置 1

让我们看一个新扩展模块的示例,该模块加载和使用我们在上一篇文章中构建的这些 API 函数。

代码#1:

#include "pythonsample.h"
/* An extension function that uses the exported API */
static PyObject *print_point(PyObject *self, PyObject *args)
{
    PyObject *obj;
    Point *p;
    if (!PyArg_ParseTuple(args, "O", &obj))
    {
        return NULL;
    }
    /* Note: This is defined in a different module */
    p = PyPoint_AsPoint(obj);
    if (!p)
    {
        return NULL;
    }
    printf("%f %f\n", p->x, p->y);
    return Py_BuildValue("");
}
  
static PyMethodDef PtExampleMethods[] =
{
    {"print_point", print_point, METH_VARARGS, "output a point"},
    { NULL, NULL, 0, NULL}
};
  
static struct PyModuleDef ptexamplemodule =
{
    PyModuleDef_HEAD_INIT,
    /* name of module */
    "ptexample", 
    /* Doc string (may be NULL) */
    "A module that imports an API", 
    /* Size of per-interpreter state or -1 */
    -1, 
    /* Method table */
    PtExampleMethods 
      
};


代码#2:模块初始化函数

PyMODINIT_FUNC
PyInit_ptexample(void)
{
    PyObject *m;
      
    m = PyModule_Create(&ptexamplemodule);
      
    if (m == NULL)
        return NULL;
      
    /* Import sample, loading its API functions */
    if (!import_sample())
    {
        return NULL;
    }
      
    return m;
}

现在要编译这个新模块,不必担心如何链接来自另一个模块的任何库或代码。可以简单地使用work.py文件,如下所示。

代码#3:

# setup.py
from distutils.core import setup, Extension
  
# May need pythonsample.h directory
setup(name ='ptexample', 
      ext_modules = [ Extension('ptexample', 
                     ['ptexample.c'], include_dirs = [], )])

完成所有这些任务后,这个新的扩展函数可以与其他模块中定义的 C API 函数完美配合。

代码#4:使用其他模块中定义的 CPI API 函数

import ptexample
import work
  
point1 = work.Point(2, 3)
print ("Point_1 : ", point1)
  
print ("\n", ptexample.print_point(p1))

输出 :

Point_1 : 

2.000000 3.000000