I have a Python project with many sub-modules that I package up with distutils. I would like to build some Python extensions in C to live in some of these sub-modules but I don’t understand how to get the Python extension to live in a submodule. What follows is the simplest example of what I’m looking for:
Here is my Python extension c_extension.c:
#include <Python.h>
static PyObject *
get_answer(PyObject *self, PyObject *args)
{
return Py_BuildValue("i", 42);
}
static PyMethodDef Methods[] = {
{"get_answer", get_answer, METH_VARARGS, "The meaning of life."},
{NULL, NULL, 0, NULL}
};
PyMODINIT_FUNC
initc_extension(void) {
(void) Py_InitModule("c_extension", Methods);
}
And here is a setup.py that works:
from distutils.core import setup
from distutils.extension import Extension
setup(name='c_extension_demo',
ext_modules = [Extension('c_extension', sources = ['c_extension.c'])])
After installing in an virtualenv I can do this:
>>> import c_extension
>>> c_extension.get_answer()
42
But I would like to have c_extension live in a sub-module, say foo.bar. What do I need to change in this pipeline to be able to get the behavior in the Python shell to be like this:
>>> import foo.bar.c_extension
>>> foo.bar.c_extension.get_answer()
42
Just change
to
You will need
__init__.pyfiles in each of thefooandbardirectories, as usual. To have these packaged with the module in your setup.py, you need to addto your setup() call, and you will need the directory structure
in your source directory.