Cython cimport无法找到.pxd模块[英] Cython cimport cannot find .pxd module

本文是小编为大家收集整理的关于Cython cimport无法找到.pxd模块的处理方法,想解了Cython cimport无法找到.pxd模块的问题怎么解决?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
# ...

in 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 s均为空,我在每个文件中都导入了absolute_import.我也更改了include_dirs,但仍然不起作用.

编辑#1

根据

编辑#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. cdef extern来自C标头.

  2. 在内联函数上包含.

推荐答案

我忽略了我有一些行,例如:

cdef INT_t some_int = 1

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

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

  1. cdef extern来自C标头.

  2. 在内联函数上包含.

本文地址:https://www.itbaoku.cn/post/1793836.html