Cython 0.23.4 AttributeError, когда файлы .pyx и .pxd находятся в подкаталоге

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

Основной файл python в рабочем каталоге:

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 (т.е. в подкаталоге pyx/):

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

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

cdef class X:
    cdef public int var

Запуск Main.py дает следующую ошибку:

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

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

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


person Rijk    schedule 22.10.2015    source источник


Ответы (2)


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 действительно не должен организовывать свои файлы так, как они делать, а не пытаться обойти это.

person DavidW    schedule 24.10.2015

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

from pxd_file cimport class_declaration 

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

from X cimport X

Взгляните на эти внутренние примеры.

person romeric    schedule 23.10.2015
comment
Это, похоже, не решает AttributeError. Мой тестовый код отлично работал до обновления Cython. Поэтому я думаю, что проблема должна быть в сгенерированных файлах .c. - person Rijk; 23.10.2015
comment
Рабочий пример, который вы опубликовали, работает без предупреждения на моей машине, с тем, что я предложил, и я использую Cython 0.23.4. Трудно догадаться, в чем проблема в вашем реальном коде. Возможно, вы можете удалить файлы .c и перекомпилировать все это. Это должно решить проблему. Если нет, то вы всегда можете сообщить об ошибке в список рассылки Cython, если считаете, что это проблема версии 0.23.4. - person romeric; 23.10.2015