без создания фактического пути.

делать расширение C для Python 3.x, когда модуль имеет подмодули? Например, у меня есть файл с именем pet.c:

#include <Python.h>

PyObject* CatMeow(PyObject* self) {
    return PyUnicode_FromString( ">*<" );
}

static PyMethodDef CatFunctions[] = {
    {(char*) "meow", (PyCFunction) CatMeow, METH_NOARGS, NULL},
    {NULL, NULL, 0, NULL}
};

static PyModuleDef CatDef = {
    PyModuleDef_HEAD_INIT, "cat", "cat ext", -1, CatFunctions,
    NULL, NULL, NULL, NULL
};

PyMODINIT_FUNC PyInit_cat(void) {
    return PyModule_Create(&CatDef);
}

static PyModuleDef PetDef = {
    PyModuleDef_HEAD_INIT, "pet", "pet ext", -1, NULL,
    NULL, NULL, NULL, NULL
};

PyMODINIT_FUNC PyInit_pet(void) {
    PyObject* p = PyModule_Create(&PetDef);
    PyObject* c = PyInit_cat();
    Py_INCREF(c);
    PyModule_AddObject( p, "cat", c );
    return p;
}

Когда я собираю его со следующим setup.py:

from distutils.core import setup, Extension

setup( 
    name='pet', 
    version='0.0', 
    ext_modules=[Extension('pet', ['pet.c'])]
)

я могу видеть

>>> import pet
>>> pet.cat.meow()
'>*<'

или же

>>> from pet import cat
>>> cat.meow()
'>*<'

что, как и предполагалось, но когда я пытаюсь

>>> from pet.cat import meow

У меня есть ModuleNotFoundError, говорящий ... Нет модуля с именем 'pet.cat'; «домашнее животное» не пакет, и если я попробую

>>> from pet import cat
>>> from cat import meow

У меня есть ModuleNotFoundError, говорящий ... Нет модуля с именем 'cat'. Но если я проверю тип кошки

>>> type(cat)
<class 'module'>

который говорит, что это модуль.

Как мне сделать эту работу? Добавление объекта модуля в другой модуль, используемый для хорошей работы в Python 2.7. Разве это не должно работать в python3 из-за абсолютного стиля импорта? Или мне нужно работать с многофазной инициализацией, как описано в PEP 489?

Ответы на вопрос(1)

Ваш ответ на вопрос