2012-08-23 17 views
16

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 

Odpowiedz

12

Wystarczy zmienić

Extension('c_extension', ...) 

do

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

Ty będzie potrzebował plików __init__.py w każdym z katalogów foo i bar, jak zwykle. Mają one pakowane z modułem w swojej setup.py, trzeba dodać

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

do konfiguracji() zadzwonić, i trzeba będzie strukturę katalogów

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

w katalogu źródłowym.

+0

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

+0

Po prostu zobaczyłem twoją edycję, dodałem także linię pakietów. – Rich

+0

Jakiej wersji Python używasz? Testuję w 2.7.3. – nneonneo