Как построить расширение Python C, чтобы я мог импортировать его из модуля
У меня есть проект Python со многими подмодулями, которые я упаковываю с distutils. Я хотел бы построить некоторые расширения Python в C, чтобы жить в некоторых из этих подмодулей, но я не понимаю, как заставить расширение Python жить в подмодуле. Ниже следует простейший пример того, что я ищу:
Вот мое расширение Python c_extension.c
:
- Создание объекта с использованием API Python C
- Учебники по оптимизации нетривиальных приложений Python с расширениями C или Cython
- Интеграция C и Python: ValueError: функции модуля не могут устанавливать METH_CLASS или METH_STATIC
- Как я могу написать функцию C, которая принимает либо int, либо float?
- Отладка расширений Python
#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
- .so не импортирует в python: динамический модуль не определяет функцию init
- компилировать libdnet для python 2.7
- Компилятор не может найти Py_InitModule () .. он устарел, и если да, то что я должен использовать?
- Что такое PyObject в Python?
- Определение PyBufferProcs в Python 2.7, когда класс реализует PEP 3118
One Solution collect form web for “Как построить расширение Python C, чтобы я мог импортировать его из модуля”
Просто измените
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
в исходном каталоге.