Ich habe ein Python-Projekt mit vielen Sub-Modulen, die ich mit distutils zusammenpacke. Ich möchte einige Python-Erweiterungen in C erstellen, um in einigen dieser Untermodule zu leben, aber ich verstehe nicht, wie die Python-Erweiterung in einem Submodul leben kann. Was folgt, ist das einfachste Beispiel dafür, was ich suche:Wie erstelle ich eine Python C Erweiterung, damit ich sie von einem Modul importieren kann
Hier ist meine Python-Erweiterung 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);
}
Und hier ist ein setup.py
, das funktioniert:
from distutils.core import setup
from distutils.extension import Extension
setup(name='c_extension_demo',
ext_modules = [Extension('c_extension', sources = ['c_extension.c'])])
Nach der Installation in ein virtualenv kann ich tun:
>>> import c_extension
>>> c_extension.get_answer()
42
Aber ich möchte c_extension
leben in einem Untermodul, sagen foo.bar
. Was muss ich in dieser Pipeline ändern, das Verhalten in der Python-Shell, so zu sein, sich zu:
>>> import foo.bar.c_extension
>>> foo.bar.c_extension.get_answer()
42
Danke für die Antwort, aber das hat nicht für mich funktioniert. Ich habe 'foo/bar' Verzeichnis mit einem' __init __ py' in jeweils zuzüglich der 'foo.bar.' Präfix im Setup-Befehl hinzugefügt, aber in der Python-Shell dies geschieht. >>> import foo.bar.c_extension Traceback (jüngste Aufforderung zuletzt): File „“ Linie 1 in Import: Kein Modul namens c_extension –
Rich
Und deine Bearbeitung sah, fügte ich die auch Pakete Linie. – Rich
Welche Version von Python verwenden Sie? Ich teste am 2.7.3. – nneonneo