Обтекание библиотеки C в Cython: ожидается ')', найдено '*' - PullRequest
0 голосов
/ 29 апреля 2018

Я хочу обернуть библиотеку следующим заголовочным файлом:

#include "rbtree.h"

struct interval_tree_node {
    struct rb_node rb;
    unsigned long start;    /* Start of interval */
    unsigned long last; /* Last location _in_ interval */
    unsigned long __subtree_last;
};

extern void
interval_tree_insert(struct interval_tree_node *node, struct rb_root *root);

extern void
interval_tree_remove(struct interval_tree_node *node, struct rb_root *root);

extern struct interval_tree_node *
interval_tree_iter_first(struct rb_root *root,
             unsigned long start, unsigned long last);

extern struct interval_tree_node *
interval_tree_iter_next(struct interval_tree_node *node,
            unsigned long start, unsigned long last);

Это мой интервал дерева.pxd:

cdef extern from "src/intervaltree.h":

    struct interval_tree_node:
        struct rb_node

    void interval_tree_insert(struct interval_tree_node *node, struct rb_root *root)

    void interval_tree_remove(struct interval_tree_node *node, struct rb_root *root)

    struct interval_tree_node * interval_tree_iter_first(struct rb_root *root, unsigned long start, unsigned long last)

    struct interval_tree_node * interval_tree_iter_next(struct interval_tree_node *node, unsigned long start, unsigned long last)

А вот мой setup.py:

from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize

setup(
    ext_modules = cythonize([Extension("intervaltree", ["intervaltree.pyx"])])
)

Мой intervaltree.pyx просто пуст, или

cimport intervaltree

Когда я запускаю python setup.py install, я получаю следующую ошибку:

    Error compiling Cython file:
------------------------------------------------------------
...
cdef extern from "src/intervaltree.h":

    struct interval_tree_node:
        struct rb_node

    void interval_tree_insert(struct interval_tree_node *node, struct rb_root *root)
                                                       ^
------------------------------------------------------------

intervaltree.pxd:6:56: Expected ')', found '*'

Так как примеры в документации Определение внешних объявлений Использование синтаксиса

int queue_push_head(Queue* queue, QueueValue data)

не

int queue_push_head(Queue *queue, QueueValue data)

Я пытался изменить эту часть, но, похоже, это не помогло. Что я делаю неправильно?

1 Ответ

0 голосов
/ 29 апреля 2018

Вам не хватает cdef перед struct interval_tree_node, поэтому Cython не распознает его как тип:

cdef struct interval_tree_node
    rb_node rb # assuming you've also defined rb_node somewhere

Соответствующая документация .

Точно так же вы хотите написать interval_tree_node, а не struct interval_tree_node в вашем коде Cython.


Обновление от ОП. Вот как это должно было выглядеть в итоге:

cdef extern from "src/rbtree.h":

    cdef struct rb_root:
        pass

cdef extern from "src/interval_tree.h":

    cdef struct interval_tree_node:
        pass

    void interval_tree_insert(interval_tree_node *node, rb_root *root)

    void interval_tree_remove(interval_tree_node *node, rb_root *root)

    interval_tree_node * interval_tree_iter_first(rb_root *root, unsigned long start, unsigned long last)

    interval_tree_node * interval_tree_iter_next(interval_tree_node *node, unsigned long start, unsigned long last)
...