2014-09-22 3 views
1

Предупреждение: я довольно новичок с Cython. : D У меня есть следующие фрагменты кода:Cython: невозможно преобразовать объект Python в структуру

my_structs.h:

typedef struct Dataset{ 
    int lines; 
    char **tid; 
}Dataset; 

myiolib.pyx:

from libc.stdlib cimport malloc 
from libc.string cimport strcpy 
from cpython.string cimport PyString_AsString 

cdef extern from "my_structs.h": 
    cdef struct Dataset: 
     int lines 
     char **tid 


cdef Dataset readDataset(TID_name): 
    cdef: 
     int i, line_count=0 
     Dataset instance 

    with open(TID_name, 'rU') as file_iter: 
     for line in file_iter: 
      line_count=line_count+1 

    instance.tid = <char **>malloc(line_count * sizeof(char *)) 

    i = 0 
    with open(TID_name, 'rU') as file_iter: 
     for line in file_iter: 
      instance.tid[i] = <char *>malloc((len(line)+1) * sizeof(char)) 
      strcpy(instance.tid[i], PyString_AsString(line.strip())) 
      i += 1 

    instance.lines = line_count 
    return instance 

mytest.pyx:

import myiolib 

cdef extern from "my_structs.h": 
    cdef struct Dataset: 
     int lines 
     char **tid 


def test(): 
    cdef Dataset D 
    D = myiolib.readDataset("test.dat") 

    # Do something... 
    # Free memory (?!) 

тест. py:

import mytest 

mytest.test() 

Когда я печатаю: cython -a mytest.pyx, он говорит: «Невозможно преобразовать объект Python в« Набор данных », , указывая на D = myiolib.readDataset (« test.dat »). Почему? Я не понимаю ... Что я делаю неправильно?

ответ

1

Во-первых, я думаю, что ваш минимальный пример довольно плох. Вы не включаете setup.py или любой другой способ запуска кода.

Таким образом, вот собственно минимальный пример:

test_python.py

import pyximport 
pyximport.install(setup_args={'include_dirs': "."}) 

import my_test 

my_test.test() 

my_test.pyx

import my_library 

cdef extern from "my_type.h": 
    cdef struct MyType: 
     int x 

def test(): 
    cdef MyType my_instance 
    my_object = my_library.my_function() 

my_library.pyx

cdef extern from "my_type.h": 
    cdef struct MyType: 
     int x 

cdef MyType my_function(): 
    return MyType() 

my_type.h

typedef struct MyType { 
    int my_attribute; 
} MyType; 

Это ошибки с:

AttributeError: 'module' object has no attribute 'my_function' 

Это происходит потому, что cdef используется, так import не разрешает доступ к этой функции. Вы тоже использовали cdef, поэтому я удивлен, что это не происходит с вами. Возможно, компиляция с setup.py не требует этого; это меня не удивило бы. Однако даже тогда вы используете import, где вы должны использовать cimport.

Добавить my_library.pxd:

cdef extern from "my_type.h": 
    cdef struct MyType: 
     int x 

cdef MyType my_function() 

необязательно удалить cdef extern из файла pyx и изменить

import my_library 

в

cimport my_library 

и она работает.

Если эти советы не исправить это для вас, пожалуйста, дайте мне пример, который я могу запустить.

+0

Вот и все! Большое спасибо. Извините, что не дал setup.py. Я полностью забыл об этом! : / – user3674296

Смежные вопросы