2012-08-23 7 views
16

Ho un progetto Python con molti sotto-moduli che impacchetta con le distutils. Mi piacerebbe creare alcune estensioni Python in C per vivere in alcuni di questi sotto-moduli ma non capisco come ottenere l'estensione Python per vivere in un sottomodulo. Quello che segue è l'esempio più semplice di quello che sto cercando:Come creare un'estensione Python C in modo da poterla importare da un modulo

Ecco la mia estensione 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); 
} 

Ed ecco un setup.py che funziona:

from distutils.core import setup 
from distutils.extension import Extension 

setup(name='c_extension_demo', 
     ext_modules = [Extension('c_extension', sources = ['c_extension.c'])]) 

Dopo aver installato in un virtualenv posso fare questo:

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

Ma io vorrebbe avere c_extension dal vivo in un sottomodulo, ad esempio foo.bar. Quello che ho bisogno di cambiare in questa pipeline per essere in grado di ottenere il comportamento nella shell Python per essere come questo:

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

risposta

12

Basta cambiare

Extension('c_extension', ...) 

a

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

È saranno necessari i file __init__.py in ciascuna delle directory foo e bar, come al solito. Per avere questi confezionati con il modulo nel vostro setup.py, è necessario aggiungere

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

al vostro setup() chiama, e sarà necessario la struttura di directory

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

nella directory di origine.

+0

Grazie per la risposta, ma questo non ha funzionato per me. Ho creato la directory 'foo/bar' con un' __init __. Py' in ogni plus aggiunto il prefisso 'foo.bar' nel comando setup ma nella shell python ciò accade: >>> import foo.bar.c_extension Traceback (ultima chiamata ultima): File "", riga 1, in ImportErrore: nessun modulo denominato c_extension – Rich

+0

E appena visto la modifica, ho aggiunto anche la linea dei pacchetti. – Rich

+0

Quale versione di Python stai usando? Sto testando su 2.7.3. – nneonneo