Как построить расширение Python C, чтобы я мог импортировать его из модуля

У меня есть проект Python со многими подмодулями, которые я упаковываю с distutils. Я хотел бы построить некоторые расширения Python в C, чтобы жить в некоторых из этих подмодулей, но я не понимаю, как заставить расширение Python жить в подмодуле. Ниже следует простейший пример того, что я ищу:

Вот мое расширение Python 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); } 

И вот setup.py который работает:

 from distutils.core import setup from distutils.extension import Extension setup(name='c_extension_demo', ext_modules = [Extension('c_extension', sources = ['c_extension.c'])]) 

После установки в virtualenv я могу сделать это:

 >>> import c_extension >>> c_extension.get_answer() 42 

Но я хотел бы иметь c_extension в подмодуле, скажем foo.bar . Что мне нужно изменить в этом конвейере, чтобы иметь возможность получить поведение в оболочке Python следующим образом:

 >>> import foo.bar.c_extension >>> foo.bar.c_extension.get_answer() 42 

Просто измените

 Extension('c_extension', ...) 

в

 Extension('foo.bar.c_extension', ...) 

Как обычно, вам понадобятся файлы __init__.py в каждом каталоге foo и bar . Чтобы они были упакованы вместе с модулем в файле setup.py, вам нужно добавить

 packages = ['foo', 'foo.bar'], 

к вызову setup (), и вам понадобится структура каталогов

 setup.py foo/ __init__.py bar/ __init__.py 

в исходном каталоге.