子类化cython类:当' cimport'

时间:2017-07-27 17:10:53

标签: python cython distutils setup.py cythonize

我刚刚在cython中偶然发现了一些奇怪的行为,我希望有人能够启发我。

我有两个包A和B,都使用distutils构建,因为我有几个cython类(其中许多包装c ++类)。

在包A中,我有一个cython类,我在.pxd文件中声明BaseAClass转发,并在相应的.pyx中完全声明。我有很多其他类在包A中继承BaseAClass

现在在包B中,我已经能够构建带有BaseAClass成员的类,只需执行

# in package B tree, .pyx file
cimport A.stuff._A as _A
cdef BClass(object):
    cdef _A.BaseAClass my_aclass
    def __cinit__(self, aclass):
        self.my_aclass = aclass

我编译和使用这些类没有问题。

但是,如果我尝试在包B中继承BaseAClass

# in package B tree, .pyx file
cimport A.stuff._A as _A
cdef BClass(_A.BaseAClass):
    """put a constructor here"""

我尝试cythonize我得到错误'_A.pxd' not found。但是,如果我这样做

# in package B tree, .pyx file
cdef BClass(A.stuff._A.BaseAClass):
    """put a constructor and methods here"""
没问题!希望有人知道发生了什么!

请注意,当我编译时,我将额外的标志" -I / path /传递给/ packageA / stuff"确保包A中的pxd文件可用于包B.另请注意,我使用与scipy类似的cythonize.py,并且我已经到处都有__init__.py个文件,我甚至尝试添加{ {1}}文件,但它没有帮助。

1 个答案:

答案 0 :(得分:1)

导入应写为from stuff cimport _A,其中stuff.pxd是与执行导入的.pyx文件位于同一目录中的定义文件。

cimport A.stuff._A as _A使Cython查找名为_A.pxd的定义文件,这可能是意外行为。

Cython可能不应该首先接受cimport X.sub_package as Y形式的导入。