我将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,我该怎么做才能运行代码?
答案 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以他们的方式组织他们的文件,而不是试图绕过它。