Cython cimport 找不到 .pxd 模块

Cython cimport cannot find .pxd module

已解决,请参阅编辑 #3

假设包的结构为:

Some_Package/ 
    some_package/
        __init__.py
        core/
            __init__.py
            definition.pxd
        helper/
            __init__.py
            helper.pxd
            helper.pyx
    setup.py

definition.pxd 我有:

import numpy as np
cimport numpy as np
# ...
ctypedef np.int32_t INT_t

helper.pxd 我有:

cimport some_package.core.definition
from some_package.core.definition cimport INT_t
# ...

helper.pyx 我没有 cimport 任何东西。我将 setup.py 配置为:

ext_modules=cythonize('./some_package/helper/helper.pyx', include_dirs=['.', './some_package/core'])

现在我的问题是 python setup.py build_ext --inplace 我可以成功构建到 .so,但是当我尝试 import some_package.helper.helper 时我得到了一个 ImportError:

ImportError: No module named "some_package.helper.helper"

我查看了 helper.cpp 并发现了一些类似的行:

  __pyx_t_1 = __Pyx_ImportModule("some_package.core.definition"); if (!__pyx_t_1) __PYX_ERR(0, 1, __pyx_L1_error)

我想这可能与导入路径有关,但我无法找出问题所在。所有 __init__.py 都是空的,我在每个文件中都导入了 absolute_import。我也更改了 include_dirs,但仍然无法正常工作。

编辑 #1

根据 documentationinclude_dirs 添加到 *.pxd 搜索路径。所以我也尝试将 helper.pxd 中的 cimport 语句更改为:

cimport definition
from definition cimport INT_t

这一次,cython 无法编译:"definition.pxd" not found。但是,它应该在搜索路径中。

编辑 #2

快速训练是在 core/ 中添加一个空的 definition.pyx,然后将扩展配置为:

extensions = [
    Extension("some_package.core.definition", ["some_package/core/definition.pyx"])
    Extension("some_package.helper.helper", ["some_package/helper/helper.pyx"])
]

然后在 setup.py:

ext_modules=cythonize(extensions)

现在 cimport some_package.core.definitionhelper.pxd 工作。

然而,这并不优雅。

编辑 3

我终于发现我忽略了一些行,例如:

cdef INT_t some_int = 1

但是,在.pxd文件中,不能有任何可执行的代码。在这种情况下,似乎 Cython 将其视为一个包,而不是 .pyx 文件。

可能有两种解决方法:

  1. cdef extern 来自 C header.

  2. Wrap-up 内联函数。

我忽略了一些行:

cdef INT_t some_int = 1

但是,在.pxd文件中,不能有任何可执行的代码。在这种情况下,似乎 Cython 将其视为一个包,而不是 .pyx 文件。

可能有两种解决方法:

  1. cdef extern 来自 C header.

  2. Wrap-up 内联函数。