Как создать отдельные файлы с зависимостями для Cython и как исправить ошибку компиляции: невозможно преобразовать объект Python в «mySet *»

1

Я пытаюсь построить мое расширение phisrt python, используя Cython.

Мои C файлы разделены логически, и функциональность "вложенная" - в этом модуле C зависит от функций, определенных в модуле B, которые затем зависят от модуля A.

Мне трудно понять, как разделить мои файлы.pxd и.pyx, чтобы я мог поддерживать зависимость между функциональными модулями.

Следующий фрагмент, надеюсь, должен помочь прояснить ситуацию:

Примечание. Файл FooBar.h содержит файл CommonDefs.h, который объявляет общие типы данных и предоставляет простой API для этих общих типов (myArray и mySet).

Я уже создал файлы ccommontypes.pxd и commontypes.pyx, которые экспортируют типы и функции данных, объявленные/определенные в CommonDefs.h и CommonDefs.c. Мне удалось успешно скомпилировать модуль расширения python.

Теперь я хочу перейти к следующему этапу, который предназначен для экспорта типов и функций данных, которые зависят от CommonDefs.h. Однако я обнаружил, что мне приходится переопределять типы myArray и mySet (хотя они уже были объявлены в ccommontypes.pxd

Кажется, я никак не могу найти импорт или включение этих объявлений, поэтому мне нужно повторно объявить их в файле ниже, поскольку функции принимают аргументы типа myArray и mySet.

Вопрос 1 Можно ли повторно использовать типы снова, как я сделал ниже, или есть какие-либо проблемы, о которых я должен знать?

//cfoobar.pxd
cdef extern from "../include/FooBar.h":
    cdef struct FooBar:
        pass

    ctypedef struct myArray:   // already declared elsewhere
        pass

    ctypedef struct mySet:     // Already declared elsewher
        pass

    struct FooBar * foobar_new(mySet *s1)


//foobar.pyx
cimport cfoobar

cdef class FooBar:
    cdef cfoobar.FooBar *_foobar
    def __cinit__(self, myset):
        _foobar = cfoobar.foobar_new(myset);
        if (ret == 0):
            raise MemoryError()

Вопрос 2 В приведенном выше коде FooBar ctor функция выделения памяти ожидает указатель на переменную mySet. Однако, когда я пытаюсь скомпилировать этот код, я получаю эту ошибку:

Невозможно преобразовать объект Python в 'mySet *'

Я понимаю сообщение об ошибке, но поскольку Python не статически типизирован, я не знаю, как я могу указать тип данных.

Я был бы признателен за помощь в решении этого вопроса.

Теги:
cython
python-extensions

1 ответ

0

Я столкнулся с этим вопросом, пытаясь разобраться в проблемах с редизайном в самих pxds. Я считаю, что должно быть какое-то "gotchas", но я не рискну еще сказать, что это такое. :)

Но на вопрос 2: python динамически типизирован, но cython не... просто переменные без типов статически типизируются как объекты python.

Ты можешь измениться:

def __cinit__(self, myset):

чтобы:

def __cinit__(self, mySet *myset):

если вы действительно передаете указатель на myset...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню