Cython cimport 找不到 .pxd 模块



已解决,请参阅编辑 #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

根据文档,include_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.definition正在helper.pxd工作.

但是,这并不优雅。

编辑 3

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

cdef INT_t some_int = 1

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

可能有两种解决方法:

  1. C标头cdef extern

  2. 内联函数的总结。

我忽略了我有一些行:

cdef INT_t some_int = 1

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

可能有两种解决方法:

  1. C标头cdef extern

  2. 内联函数的总结。

最新更新