子目录中的 .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 真的不应该不要按照他们的方式组织文件,而不是尝试绕过它。