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

Я пытаюсь построить свое первое расширение 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 не является статически типизированным, я не получаюНе знаю, как я могу указать тип данных.

Буду признателен за помощь в решении этой проблемы.

1 Ответ

0 голосов
/ 30 апреля 2012

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

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

до:

def __cinit__(self, mySet *myset):

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

...