0

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

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

在包 AI 中有一个 cython 类,我BaseAClass在 .pxd 文件中声明并在相应的 .pyx 中完全声明它。BaseAClass我在包 A 中有许多其他类的子类。

现在在包 BI 中已经能够构建带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

而且我在编译和使用这些类时没有问题。

但是,如果我尝试BaseAClass在包 B 中进行子类化:

# 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/to/packageA/stuff”以确保包 A 中的 pxd 文件可用于包 B。另请注意,我使用了类似的 cythonize.py对于 scipy,我已经__init__.py到处都有文件,我什至尝试添加一个__init__.pxd文件,但它没有帮助。

4

1 回答 1

1

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

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

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

于 2017-09-13T13:40:45.390 回答