Я написал библиотеку питон с двумя частями:Как упаковать расширение Python C так, чтобы он был подмодулем нормального модуля Python?
- Python, C расширения
- 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()
@MatthewMoisen Вы сказали «(Мой вопрос тонкость отличается от [этого] (http://stackoverflow.com/questions/12097755/how-to -build-a-python-c-extension-so-i-can-import-it-from-a-module)) «Не могли бы вы объяснить, почему? – MSeifert
@MSeifert, после того, как я пошел дальше, я теперь понимаю, что это было совсем не так, чтобы оправдать новый вопрос. (Разница в том, что я хочу, чтобы мой c-расширение на один уровень был глубоким, тогда как OP хотел, чтобы его два уровня были глубокими). Моя проблема заключалась в том, что мой файл 'tests.py' находился в том же каталоге, что и модуль foo, поэтому импорт был отключен, когда я его запускал. Для этого была создана установка 'tests/tests.py'. –