子目录中的 .pyx 和 .pxd 文件时 Cython 0.23.4 AttributeError
Cython 0.23.4 AttributeError when .pyx and .pxd files in subdirectory
我将我的 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 的情况下,如何获取代码 运行?
问题是如果您将头文件 (.pxd
) 拆分到不同的目录中,除非您显式导入声明,否则 Cython 找不到您的头文件 (.pxd
)
from pxd_file cimport class_declaration
假设 pxd_file
的路径对编译器可见。在您给出的示例中,这简单地转换为
from X cimport X
看看这些 Cython 的 internal examples。
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 真的不应该不要按照他们的方式组织文件,而不是尝试绕过它。
我将我的 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 的情况下,如何获取代码 运行?
问题是如果您将头文件 (.pxd
) 拆分到不同的目录中,除非您显式导入声明,否则 Cython 找不到您的头文件 (.pxd
)
from pxd_file cimport class_declaration
假设 pxd_file
的路径对编译器可见。在您给出的示例中,这简单地转换为
from X cimport X
看看这些 Cython 的 internal examples。
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 真的不应该不要按照他们的方式组织文件,而不是尝试绕过它。