Cython cimport找不到.pxd模块

时间:2017-08-28 08:25:50

标签: python cython cythonize

已解决,请参阅编辑#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搜索路径。所以我也尝试将cimport中的helper.pxd语句更改为:

cimport definition
from definition cimport INT_t

这一次,cython无法编译:{{1​​}}。但是,它应该在搜索路径中。

编辑#2

快速锻炼是在"definition.pxd" not found中添加空definition.pyx,然后将扩展名配置为:

core/

然后在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

然而,这并不优雅。

编辑3

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

helper.pxd

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

可能有两种方法可以解决:

    来自.pyx标题的
  1. cdef extern

  2. 总结内联函数。

1 个答案:

答案 0 :(得分:0)

我忽略了我有一些行:

cdef INT_t some_int = 1

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

可能有两种方法可以解决:

    来自cdef extern标题的
  1. C

  2. 总结内联函数。