当子目录中的.pyx和.pxd文件时,Cython 0.23.4 AttributeError

时间:2015-10-22 21:49:11

标签: cython subdirectory attributeerror

我将Cython升级到版本0.23.4,当我将.pyx和.pxd文件放在我的工作目录的子目录中时,我的代码现在导致了AttributeError。 包含错误的最小示例如下:

工作目录中的主要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,我该怎么做才能运行代码?

2 个答案:

答案 0 :(得分:0)

问题是如果你将它们分成不同的目录,Cython找不到你的头文件(from pxd_file cimport class_declaration ),除非你明确导入声明

pxd_file

假设编译器可以看到from X cimport X 的路径。在示例的情况下,您已经将此转换为

indent0-> parent node

看看这些Cython的internal examples

答案 1 :(得分: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真的不应该&#39 ; t以他们的方式组织他们的文件,而不是试图绕过它。