О, ну, для тех, у кого похожая проблема, похоже, что я нашел ответ.
Я ожидал, что python автоматически просканирует символы, скомпилированные в общей библиотеке FragIdx.so, вместо этого похоже, что эта информация должна быть явно предоставлена в виде файла .pxd (который становится файлом заголовка C после запуска Cython).
Процесс состоит в основном из двух этапов:
- Создание файла определения (
.pxd
) для суперкласса;
- Импорт определения суперкласса через
cimport
(в отличие от import
) в модуле подкласса.
Итак, чтобы сделать его более общим.
Предположим, что вы определили тип cdef-ed A
в модуле pkg1.mod1
. Затем вы определяете тип 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 , хотя, возможно, она может быть немного более явной.
Надеюсь, что эта информация может кому-то спасти.