без создания фактического пути.
делать расширение 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?