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
python >= 3.10
,distutils
is deprecated, please see my answer in another thread for detail – Rationale