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
In order to create a C-Extension, you must: Define the list of user functions in the C interface file, by including the fglExt. h header file. Compile the C interface file with your C compiler.
Just change
Extension('c_extension', ...)
to
Extension('foo.bar.c_extension', ...)
You will need __init__.py
files in each of the foo
and bar
directories, as usual. To have these packaged with the module in your setup.py, you need to add
packages = ['foo', 'foo.bar'],
to your setup() call, and you will need the directory structure
setup.py foo/ __init__.py bar/ __init__.py
in your source directory.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With