Mam projekt Python z wieloma podmodułami, które pakuję do dystrybucji z distutils. Chciałbym zbudować kilka rozszerzeń Pythona w C, aby żyć w niektórych z tych podmodułów, ale nie rozumiem, jak uzyskać rozszerzenie Pythona do życia w module częściowym. Co za tym idzie jest najprostszym przykładem tego, co szukam:Jak zbudować rozszerzenie Pythona C, aby można go było zaimportować z modułu
Oto moje rozszerzenie 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);
}
A oto setup.py
że działa:
from distutils.core import setup
from distutils.extension import Extension
setup(name='c_extension_demo',
ext_modules = [Extension('c_extension', sources = ['c_extension.c'])])
Po zainstalowaniu w virtualenv Mogę to zrobić:
>>> import c_extension
>>> c_extension.get_answer()
42
Ale ja chciałbym mieć c_extension
na żywo w podmodule, na przykład foo.bar
. Co muszę zmienić w tym rurociągu, aby móc uzyskać zachowanie w powłoce Pythona być tak:
>>> import foo.bar.c_extension
>>> foo.bar.c_extension.get_answer()
42
Dziękuję za odpowiedź, ale to nie zadziałało. Zrobiłem katalog 'foo/bar' z' __init __. Py' w każdym plusie dodałem przedrostek 'foo.bar' w komendzie instalacyjnej, ale w powłoce Pythona to się dzieje: >>> import foo.bar.c_extension Traceback (ostatnie ostatnie połączenie): Plik "", wiersz 1, w ImportError: Brak modułu o nazwie c_extension –
Rich
Po prostu zobaczyłem twoją edycję, dodałem także linię pakietów. – Rich
Jakiej wersji Python używasz? Testuję w 2.7.3. – nneonneo