Ответ 1
О, ну, для тех, у кого есть аналогичная проблема, похоже, что я нашел ответ.
Я ожидал, что python автоматически сканирует символы, скомпилированные в общую библиотеку FragIdx.so, но похоже, что эта информация должна быть явно указана как файл .pxd(который становится C файлом C после запуска Cython).
В процессе есть два этапа:
- Создание файла определения (
.pxd
) для суперкласса; - Импортирование определения суперкласса через
cimport
(в отличие отimport
) в модуле подкласса.
Итак, чтобы сделать его более общим.
Предположим, что вы определили тип cdef-ed A
в модуле pkg1.mod1
. Затем вы cdef тип B
в pkg2.mod2
, который подклассы A
.
Структура вашего каталога будет выглядеть примерно так:
pkg1/
mod1.pyx
mod1.pxd
pkg2/
mod2.pyx
mod2.pxd
В pkg1/mod1.pxd
вы бы сказали:
cdef class A:
cdef int a
cdef int b
И в pkg1/mod1.pyx
вы предоставите методы своего класса.
В pkg2/mod2.pxd
у вас будет:
from pkg1.mod1 cimport A #note "cimport"!!
cdef class B(A):
cdef ... # your attributes here
И снова, в pkg2/mod2.pyx
вам придется cimport
символ A снова:
from pkg1.mod1 cimport A #note "cimport"!!
cdef class B(A):
... # your methods here
Интересно, что если вы просто хотите использовать A
в своем коде на python, а не использовать его для определения подтипа, файл определений mod1.pxd
не нужен. Это связано с тем, что при создании типа расширения вам нужны определения, которые будут доступны для компилятора C, в то время как у вас нет этой проблемы при запуске кода на Python, но поскольку это не очень интуитивно, возможно, важно указать это из.
Эта информация действительно доступна в Документах Cython, хотя, возможно, она может быть немного более явной.
Надеемся, что эта информация может сэкономить кому-то.