2017-02-05 11 views
-1

Я написал библиотеку питон с двумя частями:Как упаковать расширение Python C так, чтобы он был подмодулем нормального модуля Python?

  1. Python, C расширения
  2. Python, обертка для расширения Python C

Я хотел бы быть в состоянии упаковать его в такой способ, которым оболочка Python является модулем верхнего уровня foo, а расширение Python C является подмодулем, расположенным по адресу foo._foo. Однако до сих пор мне удалось создать только два модуля верхнего уровня: foo и _foo.

Что нужно сделать в setup.py и в функции init_foo C для этого?

(Мой вопрос тонкость отличается от this)


структура Текущий каталог:

foo/ 
    foo/ 
     __init__.py 
    foo.c 
    setup.py 
    tests.py 

setup.py выглядит что-то вроде:

from distutils.core import setup, Extension 

module = Extension('_foo', 
        sources=['foo.c']) 

setup(name='foo', packages=['foo'], ext_modules=[module]) 

foo.c выглядит примерно так:

PyMODINIT_FUNC init_foo(void) { 
    PyObject *m; 
    m = Py_InitModule("_foo", FooMethods); 
    // .. 
} 
int main(int argc, char *argv[]) { 
    Py_SetProgramName(argv[0]) 
    Py_Initialize(); 
    init_pychbase(); 
} 

foo/__init__.py выглядит что-то вроде:

from _foo import _Foo, _Bar, _Baz 

class Foo(object): 
    def __init__(self): 
     self._foo = _Foo() 
+0

@MatthewMoisen Вы сказали «(Мой вопрос тонкость отличается от [этого] (http://stackoverflow.com/questions/12097755/how-to -build-a-python-c-extension-so-i-can-import-it-from-a-module)) «Не могли бы вы объяснить, почему? – MSeifert

+0

@MSeifert, после того, как я пошел дальше, я теперь понимаю, что это было совсем не так, чтобы оправдать новый вопрос. (Разница в том, что я хочу, чтобы мой c-расширение на один уровень был глубоким, тогда как OP хотел, чтобы его два уровня были глубокими). Моя проблема заключалась в том, что мой файл 'tests.py' находился в том же каталоге, что и модуль foo, поэтому импорт был отключен, когда я его запускал. Для этого была создана установка 'tests/tests.py'. –

ответ

0

Как уже упоминалось в связанном вопросе, решение просто изменить _foo к foo._foo:

from distutils.core import setup, Extension 

module = Extension('foo._foo', 
        sources=['foo.c']) 

setup(name='foo', packages=['foo'], ext_modules=[module]) 

Мой вопрос заключается в том, что я бегу мой tests.py из той же директории, что и модуль foo.

я это исправил путем приведения его в свой собственный каталог:

/foo 
    /foo 
     __init__.py 
    foo.c 
    setup.py 
    /tests 
     test.py