2012-08-23 11 views
16

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 

Antwort

12

Gerade

Extension('c_extension', ...) 

zu

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

Sie ändern benötigen __init__.py Dateien in jedem der Verzeichnisse foo und bar, wie üblich. Haben diese in Ihrem setup.py mit dem Modul verpackt, müssen Sie

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

zu Ihrem Setup hinzufügen() aufrufen, und Sie werden die Verzeichnisstruktur

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

in Ihrem Quellverzeichnis benötigen.

+0

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

+0

Und deine Bearbeitung sah, fügte ich die auch Pakete Linie. – Rich

+0

Welche Version von Python verwenden Sie? Ich teste am 2.7.3. – nneonneo