2015-10-22 2 views
0

Я обновил свой Cython до версии 0.23.4, и мой код теперь приводит к AttributeError, когда я помещал файлы .pyx и .pxd в подкаталоги моей рабочей директории , Минимальный пример, содержащий ошибку следующим образом:Cython 0.23.4 AttributeError, когда .pyx и .pxd файлы в подкаталоге

Главная питон файл в рабочем каталоге:

import pyximport; 
import os,sys; 
pyximport.install() 
sys.path.insert(0, os.getcwd()+'/pxd') 
sys.path.insert(0, os.getcwd()+'/pyx') 
from X import * 

xObj = X(5) 

Pyx/X.pyx (т.е. в подкаталоге дароносицы /):

cdef class X: 
    def __init__(self,var): 
     self.var = var 

PXD /X.pxd (т. Е. В подкаталоге pxd /):

cdef class X: 
    cdef public int var 

Running Main.py дает fo Ошибка llowing:

AttributeError: 'X.X' object has no attribute 'var' 

Обратите внимание, код работает отлично, если я переместить файлы X.pyx и X.pxd в мой рабочий каталог. Но это очень неудобно из-за большого количества файлов.

Что я могу сделать, чтобы запустить код, имея X.pyx и X.pxd в подкаталогах?

ответ

0

Cython ожидает, что файлы .pyx и .pxd будут находиться в одном каталоге друг с другом (это не должно быть вашим рабочим каталогом). В настоящий момент я думаю, что вы импортируете только «X.pyx», и он не понимает, что «X.pxd» связан с ним.

Таким образом, вы можете создать каталог с именем «cython_files» (чтобы сохранить ваши файлы из вашей рабочей директории), и в этом каталоге вы бы поставили как «X.pxd» и «X.pyx». Затем вы можете добавить «cython_files» к вашему пути, и вы не получите никаких ошибок атрибутов.

еще лучше, вы можете добавить «__init__.py» в свой «cython_files» каталог, а затем он рассматривается как модуль Python, и вы можете сделать from cython_files.X import X, и не надо ничего добавлять в свой путь.

Изменить для ясности: @ ответа romenic идентифицирует тот же вопрос, но предлагает немного другое решение к нему (я подозреваю работу) - этот ответ утверждает, что OP действительно не должен организовать свои файлы так, как они делают , а не пытаться обойти его.

0

Вопрос заключается в том, что Cython не может найти файлы заголовков (.pxd), если вы разделяете их в разные каталоги, если вы явно не импортировать объявления

from pxd_file cimport class_declaration 

в предположении, что путь к pxd_file видна компилятором. В случае примера вы дали это просто переводит

from X cimport X 

Посмотрите на эти Cython-х internal examples.

+0

Это, кажется, не разрешает AttributeError. Мой тестовый код работал отлично до обновления Cython. Поэтому я думаю, что проблема должна быть в сгенерированных файлах .c. – Rijk

+0

Рабочий пример, который вы опубликовали, запускается без предупреждения на моей машине, с тем, что я предложил, и я использую Cython 0.23.4. Трудно догадаться, в чем проблема в вашем фактическом коде.Возможно, вы можете удалить файлы '.c' и перекомпилировать все это. Это должно решить проблему. Если нет, вы всегда можете сообщить об ошибке в списке рассылки Cython, если вы считаете, что это проблема с версией 0.23.4. – romeric

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