Skip to content
Related Articles
Open in App
Not now

Related Articles

C API from Extension Module in Python | Set 2

Improve Article
Save Article
  • Last Updated : 27 Mar, 2019
Improve Article
Save Article

Prerequisite: C API from Extension Module in Python | Set 1

Let’s see an example of a new extension module that loads and uses these API functions that we build up in the previous article.

Code #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 =
    /* name of module */
    /* Doc string (may be NULL) */
    "A module that imports an API"
    /* Size of per-interpreter state or -1 */
    /* Method table */

Code #2 : Module initialization function

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

Now to compile this new module, one need not bother about how to link against any of the libraries or code from the other module. One can just simply use file as shown below.

Code #3 :

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

After performing all this task, this new extension function works perfectly with the C API functions defined in the other module.

Code #4 : Using CPI API functions defined in the other module

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

Output :

Point_1 : 

2.000000 3.000000

My Personal Notes arrow_drop_up
Related Articles

Start Your Coding Journey Now!