módulo de extensão python 3.x C e submódulo

Como faço para fazer uma extensão C para python 3.x quando um módulo possui submódulos? Por exemplo, eu tenho um arquivo chamado 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;
}

Quando eu o construo com o seguinte setup.py:

from distutils.core import setup, Extension

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

eu consigo ver

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

ou

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

que é como pretendido, mas quando tento

>>> from pet.cat import meow

Eu tenho um ModuleNotFoundError dizendo ... Nenhum módulo chamado 'pet.cat'; 'pet' não é um pacote, e se eu tentar

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

Eu tenho um ModuleNotFoundError dizendo ... Nenhum módulo chamado 'cat'. Mas se eu verificar o tipo de gato

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

que diz que é um módulo.

Como eu faço isso funcionar? A adição de um objeto de módulo a outro módulo costumava funcionar bem no python 2.7. Não deveria funcionar no python3 devido ao estilo de importação absoluto? Ou tenho que trabalhar com a inicialização multifásica, conforme descrito no PEP 489?

questionAnswers(1)

yourAnswerToTheQuestion